在我统一制作的游戏中,我有一个抽象超类SpaceshipController,它包含一个已实现的方法protected void updateSpaceshipMovement()。每艘宇宙飞船都有一个子类,其中一些方法被覆盖(protected new void updatePlayerMovement())。在超类中调用该方法时使用的实现,SpaceshipController我想知道在超类代码中调用该方法时是否有一种方法可以在子类中调用实现。
2 回答
要回答这个问题:
不,不是你实现这个的方式。
基类应该如何知道某个继承的类有一个覆盖其方法的方法并且应该被调用?
您必须使用关键字正确继承 ( override) 方法。virtual为了显示差异,我还添加了一个abstract方法。
public abstract class SpaceshipController
{
// already has an implementation but might be extended or overruled
protected virtual void updateSpaceshipMovement()
{
// do something general
}
// does not have an implementation -> HAS to be implemented by subclass
protected abstract void Something();
}
如果没有abstract方法,您甚至可能根本不需要创建基类abstract。
现在在子类override中的virtual方法。(并实施abstract那些。)
public class ExampleController : SpaceshipController
{
// I don't have to implement updateSpaceshipMovement
// but I want to extend or overwrite it
protected override void updateSpaceshipMovement()
{
// optional: anyway execute base code
base.updateSpaceshipMovement();
// do other stuff
}
// I have to implement this
protected override void Something()
{
// do something
}
}
如果所有子类都应该有自己的实现并且根本不使用base.updateSpaceshipMovement,那么接口可能会更好:
public interface ISpaceshipController
{
void updateSpaceshipMovement();
}
Aninterface可以被解释为仅abstract class包含方法的类,但稍后一个类可以实现多个接口,这使其成为一个非常强大的工具。 abstract
实施它,例如
public class ExampleController : MonoBehaviour, ISpaceshipController
{
// I have to implement this to fulfill the interface implementation
public void updateSpaceshipMovement()
{
// do stuff
}
}
你问的是多态性。在您的场景中,您可以通过在抽象类中提供默认实现(作为虚拟方法)来实现这一点,并且它们允许每个子类通过覆盖该方法来提供自己的实现。
中SpaceshipController,更改 protected void updateSpaceshipMovement()为protected virtual void updateSpaceshipMovement()。这告诉编译器为 SpaceshipController 和任何子类使用这个默认实现。
在您的子类中,更改protected new void updatePlayerMovement()为protected override void updatePlayerMovement(). 这告诉编译器为这个特定的类使用这个修改后的实现。
protected override void updatePlayerMovement(){
base.updatePlayerMovement(); //you can also call the parent implementation first if you so choose.
//now perform the actions specific to this sub class.
}