C# приведение к родительскому, все еще работающему дочернему методу - PullRequest
0 голосов
/ 09 января 2020

Когда этот код запускается, выдается «Дочернее выполнение» , даже если я приведу его к классу Parent ? Я, вероятно, делаю это неправильно, если так, как я могу достичь желаемого результата, имея вывод "Parent running" ? Parent instance = new Child (); должен оставаться таким же.

class Program
{
    class Parent
    {
        public virtual void Run()
        {
            Console.WriteLine("Parent running.");
        }
    }

    class Child : Parent
    {
        public override void Run()
        {
            Console.WriteLine("Child running.");
        }
    }

    static void Main(string[] args)
    {
        Parent instance = new Child();

        (instance as Parent).Run();

        Console.ReadLine();
    }
}

EDIT:

Заметил, удаляю ли я виртуальное ключевое слово из класса Parent и пометьте версию этого метода для ребенка как new , она "решает" проблему.

class Program
{
    class Parent
    {
        public void Run()
        {
            Console.WriteLine("Parent running.");
        }
    }

    class Child : Parent
    {
        public new void Run()
        {
            Console.WriteLine("Child running.");
        }
    }

    static void Main(string[] args)
    {
        Parent instance = new Child();

        (instance as Parent).Run();

        Console.ReadLine();
    }
}

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Вы в принципе не можете (если не использовать трюки с отражением). Вот как работает наследование в C#.

То, что вы могли бы сделать вместо переопределения Run, это затенить его:

public class Parent
{
    public void Run() => Console.WriteLine("Parent");
}

public class Child : Parent
{
    public new void Run() => Console.WriteLine("Child");
}

var child = new Child();
child.Run(); // prints "Child"
((Parent)child).Run(); // prints "Parent"

Затенение редко бывает хорошей идеей, поскольку оно может сбить с толку когда объект меняет свое поведение в зависимости от типа его переменной. Чтобы узнать больше о тенях, посмотрите, например, на этот вопрос .

0 голосов
/ 09 января 2020
virtual method should not do anything,it's just a contract,what your goal is a bad ideal.

you should do it like this:

public class animal
{
   public virtual void eat()
   {
      //don't do anything
   }
}

public class dog:animal
{
   public override void eat()
   {
     //eat Meat
   }
}

public class sheep:animal
{
   public override void eat()
   {
     //eat grass
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...