假设您在父类中有一个函数,它会执行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();
}
我将如何做到这一点?
答案 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()
调用基类的版本将实现您的既定目标。