2013-08-16 5 views
1

«Пусть следующий код:Вызов метода из класса base.base?

public class MultiplasHerancas 
{ 
    static GrandFather grandFather = new GrandFather(); 
    static Father father = new Father(); 
    static Child child = new Child(); 

    public static void Test() 
    { 
     grandFather.WhoAreYou(); 
     father.WhoAreYou(); 
     child.WhoAreYou(); 

     GrandFather anotherGrandFather = (GrandFather)child; 
     anotherGrandFather.WhoAreYou(); // Writes "I am a child" 
    } 

} 

public class GrandFather 
{ 
    public virtual void WhoAreYou() 
    { 
     Console.WriteLine("I am a GrandFather"); 
    } 
} 

public class Father: GrandFather 
{ 
    public override void WhoAreYou() 
    { 
     Console.WriteLine("I am a Father"); 
    } 
} 

public class Child : Father 
{ 
    public override void WhoAreYou() 
    { 
     Console.WriteLine("I am a Child"); 

    } 
} 

Я хочу напечатать„„объект

Как я мог бы сделать объект Child выполнить метод на“ I Am дедушка“от» детской базы .base "class? Я знаю, что могу это сделать, выполняет базовый метод (он будет печатать« Я - отец »), но я хочу напечатать« I am the GrandFather »! если есть способ сделать это, это рекомендуется в OOP Design?

Примечание: я не использую/не буду использовать этот метод, я просто хочу усилить наследование знаний.

ответ

5

Это может быть возможно только с использованием Method Hiding -

public class GrandFather 
{ 
    public virtual void WhoAreYou() 
    { 
     Console.WriteLine("I am a GrandFather"); 
    } 
} 

public class Father : GrandFather 
{ 
    public new void WhoAreYou() 
    { 
     Console.WriteLine("I am a Father"); 
    } 
} 

public class Child : Father 
{ 
    public new void WhoAreYou() 
    { 
     Console.WriteLine("I am a Child");    
    } 
} 

И назвать это как это -

Child child = new Child(); 
((GrandFather)child).WhoAreYou(); 

Использование new ключевого слова hides the inherited member of base class in derived class.

2

Попробуйте использовать «новый» ключевое слово вместо «переопределить» и удалить «виртуальный» ключевое слово из методов;)

0

Эта программа дает ошибку при запуске u. Удостоверьтесь, что объект child будет ссылаться на родительский класс, затем используйте метод вызова метода ссылочного типа Ex: child child = new grandfather();/здесь мы создаем экземпляр дочернего объекта, который ссылается на родительский класс./ ((Дед) ребенок) .WhoAreYou();/* теперь мы можем использовать ссылочный тип */ В противном случае они отображают ошибку при кастинге типа дедушки.

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