[OOP] Defining Classes Part One - Задача 2


4
Define several constructors for the defined classes that take different sets of arguments (the full information for the class or part of it). Assume that model and manufacturer are mandatory (the others are optional). All unknown data fill with null.
Здравейте!
Всички не задължителни полета трябва да бъдат overload от различни комбинации или може просто да се направи нещо от сорта public GSM(string model, string manufacturer, uint? price = null,string owner = null,Battery battery = new Battery(),Display display = new Display()), направо в конструктура?
Надявам се да съм формулирала правилно въпроса.
Благодаря предварително за отговорите!

в C# OOP от el_b_k (424 точки)


Отговори



1

Това с навързването на конструктори до голяма степен е остатък от по-старите версии на C# които не поддържаха default аргументи (с методите се правеше същото).

Ако нямаш добра причина да разделяш конструкторите, препоръчвам ти да караш с колкото се може по-малко - съкращаваш и опростяваш кода.

ПС: overLOAD


от staafl (5770 точки)


4
По-скоро правиш верига от конструктори, т.е. един конструктор извиква втори, който извиква трети и т.н. с цел да няма повторение на код, като всеки от конструкторите приема различен брой аргументи. Например:
GSM(string model, string manufacturer) : this(model, manufacturer, null) {}
GSM(string model, string manufacturer, string owner) : this(model, manufacturer, owner, null) {}
..... и така докато не стигнеш до последния конструктор, който трябва да е нещо от сорта на:
GSM(string model, string manufacturer, string owner, Battery battery, Display display) {
this.Model = model; this.owner = owner; ...
}

от ivanbuhov (417 точки)


0
Ако вкараш battery и display в конструктора на GSM както си го направил в поста си, какви стойности после им задаваш като създаваш обект чрез този конструктор?


0
аз ги направих да приемат default стойности. Например в Display класа за консктруктор имам:
public Display(double size = 0, int colorsCount = 0) { this.size = size; this.colorsCount = colorsCount; }
Това ти оставя възможноста, после като ги извикваш от GSM да им слагаш стойности само ако искаш.

от stann1 (1378 точки)



0

Едно въпросче:

All unknown data fill with null.

Това означава ли, че ако имаме int ове примерно трябва да ги декларираме като nullable int-ове или може да ги оставим тях по подраззбиране 0 ?


от Teodor92 (13062 точки)


0
мисля, че трябва да са nullable, защото Наков е споменавал на лекции, че се ползват точно при такива случаи.

от vlad0 (6103 точки)

0
Ок, променям :)

от Teodor92 (13062 точки)



7

Това е моето решение, за всеки клас има по няколко конструктора. Тъй като model и manufacturer са задължителни полета, те задължително трябва да присъстват в конструктора(поне аз така го разбирам), а останалите стойности, който не се инициализират първоначално от конструктора са оставени по подразбиране, тук цената е от тип decimal, защото е добра практика парите да са от този тип,а извикването на конструктори от други конструктори цели избягване на повторения 


от radoslavzi (310 точки)


0
Извинявай, как достъпваме field-a owner като той е private? В смисъл видях, във VS си работи коректно, но не мога как предава стойността като нямаме get и set. static void Main(string[] args) { GSM myPhone = new GSM("3310", "Nokia"); myPhone.owner = "Pesho"; } Нещо не мога да си обясня как го достъпваме в този случай

от vlad0 (6103 точки)

0
Ами, то не можеш директно, тъй като е private, ако беше public - ок. Имаш 2 варианта(или поне аз за толкова се сещам), единият е да направиш полето Public, а другия е да създадеш Property(свойство), което е public

от radoslavzi (310 точки)



0

Добре де ако оставим някои коструктори празни без да задаваме null, подразбиране price си е null( при int?) - има ли някакви минуси този вариянт и въобще изпълнена ли е задачата така ?

 

 public GSM(string model, string manufacturer)
        {
            
        }
        
        public GSM(string model, string manufacturer, int? price, string owner, Battery battery, Display display)
        {
            this.model = model;
            this.manufacturer = manufacturer;
            this.price = price;
            this.owner = owner;
        }

от Al.polichronov (1567 точки)


0
Конструкторите трябва да се наследяват един друг с : this(model, manufacturer,price,null) , примерно. , всеки, към по голям, докато се стигне до най-пълния в който са всички елементи +this.Battery = battery; и this.Display = display;. Така всъщност си им задаваш null, като ги конструираш.

от el_b_k (424 точки)

0
пробвах го но ми даде грешка, ок мерси ще потърся как да я оправя.

от Al.polichronov (1567 точки)



0
Това ли се иска от 1 и 2ра задача ?
http://pastebin.com/HguHnDQL

от plamen.yovchev (3283 точки)


0
Бих искала да попитам по-вещите от мен за тази задача, идеята е да пишем конструктури, които се наследяват и да не ползваме пропъртита => полетата да са публични, или да ползваме конструктури, в които задаваме параметри, с или без пропъртита? Не знам колко ясно се изразих, но аз първо написах следния код: http://pastebin.com/PbiqseGf , а май не е това идеята....

от vanina_nenova (327 точки)


0
В общи линии се иска това, което си написала, но трябва да сложиш още няколко конструктора, които да приемат различен брой аргументи.
Също така, fields e желателно да са ти private.
Пропъртита се добавят, но те са към следващите задачи :)

от kdikov (3407 точки)

0
Мерси за отговора! Направих полетата public, за да не добавям пропъртита, а понеже съм оставила един Мain метод за тестване, който не печата, ако са private. Благодарности за съвета, ще добавя конструктори с различен брой аргументи.

от vanina_nenova (327 точки)


0

Аз имам въпрос относно null-a:

 

private string sizeSideA;
        private string sizeSideB;
        private string colorNumber;
 
        public Displays()
        {
            this.sizeSideA = null;
            this.sizeSideB = null;
            this.colorNumber = null;
        }
 
        public string SizeSideA
        {
            get { return this.sizeSideA; }
            set { this.sizeSideA = value; }
        }
        public string SizeSideB
        {
            get { return this.sizeSideB; }
            set { this.sizeSideB = value; }
        }
        public string ColorNumber
        {
            get { return this.colorNumber; }
            set { this.colorNumber = value; }
        }
 
Нещо такова ли трябва да бъде или не - съжалявам за дългият код, но така ми е по-ясно (на мен си де). 
Тествах го и assign-ва null values обаче не ми е ясно дали е коректно направено? 
Ако не е моля дайте някакъв пример за това как ще е най-коректно да се направи.



0
Според мен по скоро трябва да направиш няколко контруктора като по късите наследяват по-дългите, замествайки в наследените с null за полетата който не се въвеждат public Display() : this(null, null) {
}
public Display(double? size) : this(null, size) {
} , докато стигнеш до пълния конструктор в който в случая имаш this.SizeSideA = sizeSideA; (this... с главна буква за да минава през пропъртито) this.SizeSideB = sizeSideB; this.ColorNumber = colorNumber ;

от el_b_k (424 точки)


0
Ами аз я направих така. Само дето класовете са ми отделни не са на куп както в този пейст.
http://pastebin.com/QZ23WVDt



0
Колеги , след проверка установих , че горният линк води до error "Object reference not set to an instance of an object".

от Валентин Георгиев (0 точки)

0
Мда оплескал съм ги нещата. 48 и 49 ред трябва да са = new Display() и = new Battery(), а не = null. Оправено е, мерси за коментара !



1

Според мен най-удобния вариант е да зададеш стойности null на всички променливи, освен на модела и производителя, които са задължителни. Така няма нужда да наследяваш всички тези конструктори, защото ако не подадеш стойност на другите променливи се приема, че тя е null или няма демек и се конструира без тези аргументи.

public GSM(string model, string manufacturer, int? price=null, string owner=null, Battery battery=null, Display display=null)
        {
            this.Model = model;
            this.Manufacturer = manufacturer;
            this.Price = price;
            this.Owner = owner;
            this.Batteryy = battery;
            this.Displayy= display;
        }
 
Може и да съм в грешка де, но аз поне така съм го направил.


от tankovski (2828 точки)


0
Ако така работи коректно на мен лично ми изглежда много по-добро решение, но трябва да се тества

от atodorova (1273 точки)


0

Имам един въпрос:искам единия от конструкторите ми да задава начални стойности на всички освен owner,като предполагам,че като задавам някакви стойности на Battery и Display,всъщност трябва да задам на полетата в тях.Та написах нещо от рода на:

 

public GSM(string model, string manufacturer, double price, Battery battery, Display display)
    : this(model, manufacturer, price, null, battery, display)
{
}
Ама очевидно е голяма простотия.Някой има ли идея какво трябва да направя,за да оправя нещата? 

от yoshicore (17 точки)