从继承的类添加到父类的方法

时间:2015-10-10 16:59:18

标签: c# inheritance

假设您在父类中有一个函数,它会执行x和y。但是现在在继承的类中,你想让函数也做z。你不能覆盖它,因为这意味着该函数不再具有x和y。

这是我的团结榜样:

这是父类中的代码:

protected virtual void Start () 
{
    MyRigidBody = gameObject.GetComponent<Rigidbody>();
    if(Controls.Length < 4)
        throw new System.Exception("Controls not assigned correctly");
}

现在我想做这样的事情:

protected void Start () 
{
    MyBase.Start();//MyBase.Start doesn't work
    BlahBlahBlah();
    Stuff();
}

我将如何做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以使用base来调用Start()的基类实现。您还必须在子类中使用override virtual方法:

protected override void Start () 
{
    base.Start();
    BlahBlahBlah();
    Stuff();
}

您还可以使用模板方法模式在基类中定义方法的框架,并在派生类中提供某些部分的实现。

public void Start() 
{
    MyRigidBody = gameObject.GetComponent<Rigidbody>();
    if(Controls.Length < 4)
        throw new System.Exception("Controls not assigned correctly");

    DoSomethingElse();
}

protected virtual void DoSomethingElse()
{
    //can be empty in base class, derived classes provide the implementation
}

Start方法不是虚拟的。如果要修改派生类中Start方法的行为,请覆盖DoSomethingElse()

答案 1 :(得分:1)

添加override关键字。

protected override void Start()
{
   base.Start();
   DoSomethingElse();
}

答案 2 :(得分:0)

我在这里看到两个问题,一个在您的代码示例中,另一个在您对覆盖如何工作的理解中。

  • Start()已被定义为父类的protected virtual方法。除非您在派生类中将Start()声明为protected override,否则您在派生类中的定义与父级定义冲突。
  • 声明方法的覆盖并不妨碍您包含基类方法提供的功能。您可以通过使用Start()调用它来调用基类的base.Start();定义。您通过MyBase.Start()调用它的尝试不起作用,因为该语法试图告诉编译器找到{名为static的{​​{1}}中的{1}}方法,该方法不存在(或者至少不在您提供的示例中。)

简而言之,将MyBase声明为Start()并通过Start()调用基类的版本将实现您的既定目标。