代码之家  ›  专栏  ›  技术社区  ›  T. Grumser

是否有方法调用方法的最子类实现?

  •  -1
  • T. Grumser  · 技术社区  · 7 年前

    在我的游戏中,我让团结成为一个抽象的超类。 SpaceshipController 它包含一个实现的方法 protected void updateSpaceshipMovement() . 对于每艘宇宙飞船都有一个子类,其中一些子类中的方法被重写。( protected new void updatePlayerMovement() )在超类中调用的方法使用 宇宙飞船控制器 我想知道在超类代码中调用方法时,是否有一种方法可以调用子类中的实现。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Brian    7 年前

    回答问题:

    不,不是你实现这个的方式。

    基类应该如何知道某个继承类中有一个方法覆盖了它的方法,应该改为调用它?


    你必须正确继承( 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();
    }
    

    如果没有 摘要 方法甚至不必生成基类 摘要 完全。

    现在在子类中 重写 这个 事实上的 方法。(并执行 摘要 一个)

    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
        }
    }
    
    • virtual 手段:
      该方法在基类中已经有一个实现,但可以用重写或扩展 base.method()

    • abstract 手段:
      基类中没有必须由子类实现的实现。


    在这种情况下,所有子类都应该有自己的实现,而不是使用 base.updateSpaceshipMovement 也许是一个 interface 甚至可能更好:

    public interface ISpaceshipController
    {
        void updateSpaceshipMovement();
    }
    

    interface 可以解释为 abstract class 其中包含 只有 摘要 方法, 但是 稍后一个类可以实现 倍数 接口使它成为一个非常强大的工具。

    实施它,例如

    public class ExampleController : MonoBehaviour, ISpaceshipController
    {
        // I have to implement this to fulfill the interface implementation
        public void updateSpaceshipMovement()
        {
            // do stuff
        }
    } 
    
        2
  •  1
  •   Babak Naffas    7 年前

    你要问的是多态性。在您的场景中,您可以通过在抽象类(作为虚拟方法)中提供默认实现来实现这一点,并且允许每个子类通过重写该方法来提供自己的实现。

    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.
    
    }