【问题标题】:C# Beginner: Parent Callback method called instead of child'sC#初学者:调用父回调方法而不是子方法
【发布时间】:2017-10-21 03:42:26
【问题描述】:

我有一个小问题(还在学习 OOP)。我正在调用父类的“GoTo”方法,我希望在完成时通知该对象,但由于某种原因,调用了父类的回调方法而不是子类(即使我将子对象作为参数传递)。

问题:显然我遗漏了一些非常基本的东西,但我不确定是什么。我需要做什么才能调用孩子的“Imthere”方法而不是父母? (在父方法中强制转换为特定的子对象不适用,因为我想重用在不同子对象上截取的相同代码)。

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");
    }
}

谢谢!

【问题讨论】:

  • 我相信您需要在Parentoverride 中将Imthere 设为虚拟Child
  • 您在编译此代码时收到警告说它可能是错误的。新程序员注意:我们添加这些警告是有原因的。请注意他们。 他们会帮助您发现这些问题并加以解决。你能描述一下为什么你忽略了这个警告吗?是不清楚,还是很难看到,还是什么?
  • 嘿。我没有收到任何编译警告,因为 Unity 没有显示它们。我在 VS 中编码,但一切都是由游戏引擎编译的。
  • @rootpanthera:弄清楚如何尽快访问这些警告。我确信有办法做到这一点。

标签: c#


【解决方案1】:

需要是父类中的虚方法:

public class Parent {

    //... snip

    protected virtual void Imthere() { 
        Log("Parent");
    }
}

并且子需要在自己版本的方法中添加override关键字:

public class Child : Parent
{
    protected override void Imthere()
    {
        Log("Child");
    }
}

如果你不这样做,你实际上是在告诉编译器,当有人通过对 Parent 的引用调用 Imthere 方法时(或者像你所做的那样引用该方法 - 相同区别),您想要该方法的Parent 版本。这是有充分理由的默认行为:您的类可能具有复杂的内部结构,其中有几个方法相互调用。您不希望任何随机子类能够通过用其他代码替换部分代码来破坏它。

virtual 关键字表示子类可以根据需要覆盖该特定方法(或属性)——而子类中的 override 关键字表示子类实际上正在这样做。

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多