Аз правя програма, която използва полиморфизъм, нов списък. Сега, когато използвам стойностите в списъка, вече определих кои са дете и родител чрез изявление 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
.