我有一点问题(仍在学习OOP)。我打电话给父母" GoTo"方法,我希望该对象在完成后得到通知,但由于某种原因,来自父类的回调方法被调用而不是子对象(即使我将子对象作为参数传递)。
问题:很明显我错过了一些非常基本的东西,但我不确定是什么。我需要做什么才能让孩子" Imthere"方法将被调用而不是父母? (转换为父方法中的特定Child对象不适用,因为我想重用相同的代码剪切不同的子对象)。
public class Parent {
public void GoTo(Parent movingObject) {
//Random code here.
OnComplete(movingObject.Imthere);
}
protected void Imthere() {
//This gets called when some task is Completed!
Log("Parent");
}
}
public class Child : Parent
{
protected void Imthere()
{
//This SHOULD get's called when task is completed, but it's not.
Log("Child");
}
}
谢谢!
答案 0 :(得分:5)
它必须是父级中的虚拟方法:
public class Parent {
//... snip
protected virtual void Imthere() {
Log("Parent");
}
}
孩子需要将override
关键字添加到自己的方法版本中:
public class Child : Parent
{
protected override void Imthere()
{
Log("Child");
}
}
如果你不这样做,你实际上告诉编译器当有人通过引用Imthere
来调用Parent
方法时(或者当你接受方法时)做了 - 相同的差异),你只有想要方法的Parent
版本。这是有充分理由的默认行为:你的类可能有复杂的内部结构,有几种方法相互调用。您不希望任何随机子类通过用其他代码替换部分代码来破坏它。
virtual
关键字表示允许子类根据需要覆盖该特定方法(或属性) - 并且子级中的override
关键字表示孩子实际上正在这样做。