Loading...
scinetic avatar scinetic 40 Точки

Преизползване на конструктори - Как?

Здравейте колеги,

търсих навсякъде полезна информация за това как се преизползва конструктор, но така и не успях да намеря такава, която да ми покаже как точно аджеба става тая работа.. Пиша във форума с надеждата някой да помогне и да ми се изясни тая простотия веднъж завинаги..

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
C# OOP Basics
a.angelov avatar a.angelov 1316 Точки
 public Person(string name, int age, string email)
{
this.Name = name;
this.Age = age;
this.Email = email;
}

public Person(string name, int age)
: this(name, age, null)
{

}

public Person(string name)
: this(name, 0, null)
{

}
0
scinetic avatar scinetic 40 Точки

Ето тук се питам защо в третия конструктор трябва да има 0 вместо age?

0
RoYaL avatar RoYaL Trainer 6849 Точки

Защото нямаш age и трябва да подадеш някаква стойност - в случая хардкодваш 0. Ако смяташ, че е удачно може да хардкоднеш и друга стойност. Просто 0 е дефолтната за инт.

0
a.angelov avatar a.angelov 1316 Точки

Защото int не е nullable тип. Ако искаш да му подадеш null трябва да декларираш полето/пропъртито с int? - което вече превръща типа в nullable.

ПС. Обикновено ситуацията е обратната - правиш първо конструктор с най-малкото параметри, а в следващите конструктори добавяш нови параметри - тоест надграждаш го.

0
23/01/2015 19:18:10
RoYaL avatar RoYaL Trainer 6849 Точки

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

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;

}

7
23/01/2015 19:17:35
cherokee avatar cherokee 146 Точки

И най-добре тази нула вместо да я хардкодваш я изведи в една константа с ясно име какво означава :) например "ZeroAge" или нещо по смислено.

0
a.angelov avatar a.angelov 1316 Точки

Точно - примера, който RoYaL е дал е най-правилен.

Но наистина в задачата от домашното се иска точно обратното...

0
AleksandurSeferinkin avatar AleksandurSeferinkin 333 Точки

Според мен е най-добре един конструктор с optional параметри!

public Person(string name, int age = 0, string email = null)
{
this.Name = name;
this.Age = age;
this.Email = email;
}
1
scinetic avatar scinetic 40 Точки

@RoyaL, мерси за отговора ти. И според мен е по-логично да се извиква от по-големия към по-малкия. Вече така ще го правя.

0
ph.kolarov avatar ph.kolarov 63 Точки

И аз имам едно питане, че се овъртях малко...

Може ли някой да ми каже каква е разликата между опшънъл параметрите и чейнването на конструторите и кое кога да използваме ?

Благодаря ! 

 

0
cherokee avatar cherokee 146 Точки

Изключително добра статия @RoYaL, много благодаря (мислех си, че всичко ми е ясно, но видях например тънкият начин, по който компилатора прави версии на опционалните параметри и после какви главоболия може да причини). Силно я препоръчвам на всички колеги, които сега захапват ООП-то, а също и тези, които вече са го извършали и са решили, че са затворили тази глава от "книгата".

0
25/01/2015 16:41:57
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.