1

У меня есть следующий код:Принудительно метод переопределения для базового класса

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

+3

Я не думаю, что вы полностью понимаете наследование. вам нужно создать экземпляр Child, если вы хотите, чтобы метод Display() выводил «Child» –

+1

. Для отредактированной части вопроса вы должны увидеть: http://stackoverflow.com/questions/2779146/c-is-there- way-for-a-class-to-remove-methods-that-it-has-inherited, а также этот: http: // stackoverflow.com/questions/1125746/how-to-hide-remove-a-base-classes-methods-in-c – Habib

ответ

1

Нет, это не возможно, вы должны создать экземпляр объекта Child вместо корня

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

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

+0

Я не хочу изменять временный объект. – XandrUu

+0

затем изменить root, чтобы отобразить «child» вместо этого ... –

+0

Я не хочу этого делать, я хочу создать плагин, а не изменять базовый код проекта, плагин должен быть расширением, которое исключает метод Root и вызывает только мой метод Child. – XandrUu

6

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

Вам необходимо создать экземпляр класса Child.

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

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

1

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

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

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

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

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

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

+0

Я не хочу изменять временный объект. – XandrUu

+2

Тогда вы не знаете, что делаете –

2

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

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

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

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

Смежные вопросы