C#Beginner:调用父回调方法而不是孩子的

时间:2017-10-20 19:11:38

标签: c#

我有一点问题(仍在学习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");
    }
}

谢谢!

1 个答案:

答案 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关键字表示孩子实际上正在这样做。