我不确定这在 C# 中是否允许,但我很确定我以前用其他语言做过。
假设我有班级,Parent
,其中有孩子Child0
和Child1
。我制作了一个类型数组Parent
where Array[0]
is of typeChild0
和Array[1]
is of type Child1
。在这种情况下,我如何调用孩子的方法?当我输入Array[0].Method()
时,它会调用Parent
Method 的版本。如何让它调用Child0
方法的版本?这可能吗?
我不确定这在 C# 中是否允许,但我很确定我以前用其他语言做过。
假设我有班级,Parent
,其中有孩子Child0
和Child1
。我制作了一个类型数组Parent
where Array[0]
is of typeChild0
和Array[1]
is of type Child1
。在这种情况下,我如何调用孩子的方法?当我输入Array[0].Method()
时,它会调用Parent
Method 的版本。如何让它调用Child0
方法的版本?这可能吗?
您只需在基类中将 Method 声明为 virtual:
public class Parent{
public virtual void Method(){
...
}
}
并在继承类中覆盖它:
public class Child : Parent{
public override void Method(){
...
}
}
请注意,如果您的 Parent 类中不需要“标准”实现,因为所有继承类都有自己的版本,您也可以将方法设置为抽象:
public class Parent{
abstract public void Method();
}
然后你没有选择,所有从 Parent 继承的类都必须提供 Method 的实现,否则你会遇到编译时错误。
如果您创建父方法virtual
,则可以覆盖子类中的基方法。
public class Human
{
// Virtual method
public virtual void Say()
{
Console.WriteLine("i am a human");
}
}
public class Male: Human
{
// Override the virtual method
public override void Say()
{
Console.WriteLine("i am a male");
base.Draw(); // --> This will access the Say() method from the
//parent class.
}
}
将它们添加到数组中:(尽管我个人会使用 a List<T>
)
Human[] x = new Human[2];
x[0] = new Human();
x[1] = new Male();
打印结果:
foreach (var i in x)
{
i.Say();
}
将打印出来
"i am a human" // --> (parent class implementation)
"i am a male" // --> (child class implementation)