Применить метод переопределения к базовому классу

У меня есть следующий код:

public partial class Root : ICustomInterface
{
    public virtual void Display()
    {
        Console.WriteLine("Root");
        Console.ReadLine();
    }
}
public class Child : Root
{
    public override void Display()
    {
        Console.WriteLine("Child");
        Console.ReadLine();
    }
}
class Program
{
    static void Main(string[] args)
    {
        Root temp;
        temp = new Root();
        temp.Display();
    }
}

Output: "Root"
Desired output: "Child"

Когда я создаю экземпляр объекта Root и вызываю метод Display(), я хочу отобразить переопределенный метод в Child, возможно ли это.

Мне это нужно, потому что я должен создать плагин, который является расширением базового кода и не использует метод Display() класса Root, а реализует только метод плагина Child.


person XandrUu    schedule 04.04.2013    source источник
comment
Я не думаю, что вы полностью понимаете наследование. вам нужно создать экземпляр Child, если вы хотите, чтобы метод Display() выводил Child   -  person Dave Lawrence    schedule 04.04.2013
comment
Для отредактированной части вопроса вы должны увидеть: stackoverflow.com/questions/2779146/, а также этот: stackoverflow.com/questions/1125746 /   -  person Habib    schedule 04.04.2013


Ответы (5)


Нет, это невозможно, вам нужно создать дочерний объект вместо корня.

Root temp;
temp = new Child();
temp.Display();

если вы не хотите изменять temp, вам нужно изменить метод отображения Root, чтобы напечатать «child» вместо root

person Fabio Marcolini    schedule 04.04.2013
comment
Я не хочу изменять временный объект. - person XandrUu; 04.04.2013
comment
Я не хочу этого делать, я хочу создать плагин и не изменять базовый код проекта, плагин должен быть расширением, которое аннулирует корневой метод и вызывает только мой дочерний метод. - person XandrUu; 04.04.2013
comment
Это невозможно, если объект является Root и Root отображает Root. Как вы собираетесь изменять вывод, если вы не можете изменить код? - person Fabio Marcolini; 04.04.2013

Когда я создаю объект Root и вызываю метод Display(), я хочу отобразить переопределенный метод в Child, возможно ли это.

Вам нужно создать экземпляр класса Child.

Root temp;
temp = new Child(); //here
temp.Display();

В настоящее время ваш объект temp содержит ссылку на базовый класс, он ничего не знает о дочернем элементе, следовательно, вывод из базового класса.

person Habib    schedule 04.04.2013

Когда я создаю объект Root и вызываю метод Display(), я хочу отобразить переопределенный метод в Child, возможно ли это.

Нет. Предположим, вы добавляете еще один класс:

public class Child2 : Root
{
    public override void Display()
    {
        Console.WriteLine("Child 2");
        Console.ReadLine();
    }
}

Тогда какой метод (Child.Display() или Child2.Display()) вы ожидаете вызвать для экземпляра Root?

person Henk Holterman    schedule 04.04.2013

Это невозможно с вашим текущим кодом, потому что вы создаете экземпляр Root, а не экземпляр Child. Поэтому он понятия не имеет о методе Display внутри Child.

Вам нужно создать класс Child:

Root temp;
temp = new Child();
temp.Display();
person Arran    schedule 04.04.2013

Это не то, как работает ООП. Вы не можете использовать переопределенный метод в базовом классе. Если вы сделаете это:

static void Main(string[] args)
{
    Root temp;
    temp = new Child();
    temp.Display();
}

Вы должны получить желаемый результат.

person Elad Lachmi    schedule 04.04.2013
comment
Я не хочу изменять временный объект. - person XandrUu; 04.04.2013
comment
Тогда вы не знаете, что делаете - person Dave Lawrence; 04.04.2013