/ / Как мога да променя полиморфна променлива в типа на дете? - ° С#

Как мога да променя полиморфна променлива в типа на дете? - ° С#

Аз правя програма, която използва полиморфизъм, нов списък. Сега, когато използвам стойностите в списъка, вече определих кои са дете и родител чрез изявление if, но проблемът е, че не мога да получа достъп до някой от атрибутите на детето.Всякакви предложения? (Примерният код по-долу)

//In Class one
public List<Parent> parent;
parent.Add(new Child());


//In Class two
if (parent[0] is Child)
{
//treats it as parent
Console.WriteLine(parent[0].name());
}

В горния код името на атрибута е публичноно в клас на детето, така че нямам достъп до атрибутите на детето, защото не знае, че е дете. Има ли начин да направя обекта дете? Списъкът трябва да използва полиморфизма, защото има няколко различни класа деца, които трябва да са в един списък.

Отговори:

1 за отговор № 1

Аз ще използвам as ключова дума. Това е безопасно предаване, което се връща нулево, когато гласове не са възможни.

Child child = obj as Child;
if (child!=null)
{
child.childMethod();
}

0 за отговор № 2

При наследяване и полиморфизъм, референтният обект на родител, който сочи обект Дете, може да има достъп само до родителски методи по време на изпълнение. Въпреки това тя може да бъде хвърлена и да бъдат наречени методите на детето. ((Child) obj).childMethod();


0 за отговор № 3

Можете да получите на детето методи чрез леене, както следва:

//In Class one
public List<Parent> parent;
parent.Add(new Child());

//In Class two
Child parentAsChild = parent[0] as Child;
if (parentAsChild != null)
{
Console.WriteLine(parentAsChild.name());
}

Най- as операторът изпълнява "отбранителен" глас, който връща нула, ако parent[0] не може да бъде хвърлен на a Child обект.

Бъдете внимателни обаче - вие заобикалятецелта на полиморфизма чрез това. Цялата точка на полиморфизма е, че не трябва да правите типови проверки и кастинг - класата на детето трябва да замени всяко поведение, което се различава от родителя.


0 за отговор № 4

Или плъзнете обекта Child след проверка на типа:

//In Class one
public List<Parent> parent;
parent.Add(new Child());

//In Class two
if (parent[0] is Child)
{
var child = (Child) parent[0];
Console.WriteLine(child.name());
}

или хвърли обекта Child преди да проверите типа:

//In Class one
public List<Parent> parent;
parent.Add(new Child());


//In Class two
var child = parent[0] as Child;
if (child != null)
{
//treats it as parent
Console.WriteLine(child.name());
}

Този вид леене трябва да се избягва, когато е възможно. Помислете за използването на интерфейс, за да дефинирате приложния програмен интерфейс (API), който ще трябва да консумирате, или за дефиниране на виртуален член Parent.