Преизползване на конструктори - Как?
Здравейте колеги,
търсих навсякъде полезна информация за това как се преизползва конструктор, но така и не успях да намеря такава, която да ми покаже как точно аджеба става тая работа.. Пиша във форума с надеждата някой да помогне и да ми се изясни тая простотия веднъж завинаги..
public Person(string name, int age, string email)
{
this.Name = name;
this.Age = age;
this.Email = email;
}
public Person(string name, int age)
{
}
public Person(string name)
{
}
Как може да стане, така че вторият конструктор да преизполва първия и третия да преизползва първия?
Ето тук се питам защо в третия конструктор трябва да има 0 вместо age?
Защото нямаш age и трябва да подадеш някаква стойност - в случая хардкодваш 0. Ако смяташ, че е удачно може да хардкоднеш и друга стойност. Просто 0 е дефолтната за инт.
Защото int не е nullable тип. Ако искаш да му подадеш null трябва да декларираш полето/пропъртито с int? - което вече превръща типа в nullable.
ПС. Обикновено ситуацията е обратната - правиш първо конструктор с най-малкото параметри, а в следващите конструктори добавяш нови параметри - тоест надграждаш го.
За мен това не е правилно, но явно условието на задачата е такова. Аз лично бих подходил по друг начин. По-логично е по-големия конструктор да извика по-малкия, а с остатъка от параметрите да прави нещо.
public Person (string name)
{
this.Name = name;
}
public Person (string name, int age) : this(name) // викаш конструктора с 1 параметър, той ще асайнне name, а този ще допълни и age
{
this.Age = age;
}
public Person (string name, int age, string email) : this(name, age) // викаш конструктора с два параметъра. Той ще извика този с един и ще асайнне нейм. После самият той ще асайнне age. А по-долу ще допълниш email
{
this.Email = email;
}
И най-добре тази нула вместо да я хардкодваш я изведи в една константа с ясно име какво означава :) например "ZeroAge" или нещо по смислено.
Точно - примера, който RoYaL е дал е най-правилен.
Но наистина в задачата от домашното се иска точно обратното...
Според мен е най-добре един конструктор с optional параметри!
@RoyaL, мерси за отговора ти. И според мен е по-логично да се извиква от по-големия към по-малкия. Вече така ще го правя.
И аз имам едно питане, че се овъртях малко...
Може ли някой да ми каже каква е разликата между опшънъл параметрите и чейнването на конструторите и кое кога да използваме ?
Благодаря !
Не бих си позволил да дам мнение при съществуването на статия от John Skeet по въпроса
http://codebetter.com/2011/01/11/c-in-depth-optional-parameters-and-named-arguments-2/
Изключително добра статия @RoYaL, много благодаря (мислех си, че всичко ми е ясно, но видях например тънкият начин, по който компилатора прави версии на опционалните параметри и после какви главоболия може да причини). Силно я препоръчвам на всички колеги, които сега захапват ООП-то, а също и тези, които вече са го извършали и са решили, че са затворили тази глава от "книгата".