Как обходить аппарацию и достичь полиморфизма без виртуального и переопределения в C#C#

Место общения программистов C#
Ответить
Anonymous
 Как обходить аппарацию и достичь полиморфизма без виртуального и переопределения в C#

Сообщение Anonymous »

У меня есть три класса с названием Animal , cat и dog , где Cat и dog наследуют от Animal :

Код: Выделить всё

public class Animal
{
public void Talk()
{
Console.WriteLine("Parent");
}
}

public class Cat : Animal
{
public new void Talk()
{
Console.WriteLine("Child(Cat)");
}
}

public class Dog : Animal
{
public new void Talk()
{
Console.WriteLine("Child(Dog)");
}
}
У меня есть другой метод в другом классе, который вызывает метод talk () на животном:

Код: Выделить всё

public static Animal FirstKindOfTalk(Animal animal)
{
if (animal.GetType() == typeof(Cat))
{
var changed = animal as Cat;

if (changed is not null)
changed.Talk();

return changed;
}
else if (animal.GetType() == typeof(Dog))
{
var changed = animal as Dog;

if (changed is not null)
changed.Talk();

return changed;
}

return animal;
}
< /code>
FirstKindOfTalk(new Animal());
=> parent печатается в консоли.

Код: Выделить всё

FirstKindOfTalk(new Cat());
=> ребенок (кошка) печатается в консоли.

Код: Выделить всё

FirstKindOfTalk(new Dog());
=> Child (Dog) печатается в консоли. Это связано с тем, что я не использую виртуальные и переопределяю в своем коде, если я их использовал, то время выполнения запустила бы реализацию передачи в параметре из метода.

Код: Выделить всё

public static Animal SecondKindOfTalk(Animal animal)
{
var changed = animal;
if (animal.GetType() == typeof(Cat))
{
changed = animal as Cat;

changed.Talk();

return changed;
}
else if (animal.GetType() == typeof(Dog))
{
changed = animal as Dog;

changed.Talk();

return changed;
}

return changed;
}
< /code>
FirstKindOfTalk(new Animal());
=> parent печатается в консоли.

Код: Выделить всё

FirstKindOfTalk(new Cat());
=> parent печатается в консоли.

Код: Выделить всё

FirstKindOfTalk(new Dog());
=> parent получается в консоли.
Что вызывает такое поведение?>

Подробнее здесь: https://stackoverflow.com/questions/762 ... verride-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»