“假设以下代码:
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对象上执行“base.base”类的方法?我知道我可以做它执行基本方法(它将打印“我是一个父亲”),但我想打印“我是一个盛大的父亲”!如果有办法做到这一点,是否建议在OOP设计中使用?
注意:我不使用/将使用此方法,我只是想加强知识继承。
答案 0 :(得分: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
。
答案 1 :(得分:2)
尝试使用“new”关键字而不是“覆盖”,并从方法中删除“virtual”关键字;)
答案 2 :(得分:0)
此程序在您运行时出错。 确保child的对象将引用父类,然后使用引用类型转换调用方法 例如:孩子=新祖父(); / 这里我们正在创建引用父类的子实例。 / ((祖父)孩子).WhoAreYou(); / *现在我们可以使用引用类型* / 否则他们会在祖父类型转换下显示错误。