代码之家  ›  专栏  ›  技术社区  ›  GrayedFox

结合父方法和子方法输出有哪些C#约定?

  •  1
  • GrayedFox  · 技术社区  · 4 年前

    在JavaScript领域度过了许多个月后,我正在学习C#(仅供参考)。

    我读了C# inheritance 介绍以及何时不使用 new/override 并且(请原谅我的无知)我想知道是否有最佳实践或约定来组合具有相同签名的父类方法和派生类方法的输出。

    我正在构建的游戏中的一个示例(不是整个文件,只是示例):

    // CharController
    using static TargetController;
    public abstract class CharacterController : MonoBehaviour, ICharacter
    {
          public virtual TargetTypes Target() {
            return TargetTypes.Character;
        }
    }
    
    // PlayerController
    using static TargetController;
    public class PlayerController : CharacterController, IPlayer
    {
          public override TargetTypes Target()
        {
            return base.Target() | TargetTypes.Player;
        }
    }
    
    // EnemyController
    using static TargetController;
    public class EnemyController : CharacterController, IEnemy
    {
          public override TargetTypes Target()
        {
            return base.Target() | TargetTypes.Enemy;
        }
    }
    

    这个 TargetType enum启用了标志,类型设置为2的幂,因此可以使用位OR运算符组合值。

    我假设(根据我目前的理解),如果我从EnemyController派生一个类,并定义了一个返回的相同方法 base.Target() | TargetTypes.Small (例如)在调用派生(叶子)类Target方法时,我会得到这三种类型: Character, Enemy, Small .

    如果这种方法完全错误,或者有一些将具有相同签名的方法的输出组合在一起的既定惯例(即也许我应该以某种方式链接这些方法?),请随时给我一个新的(请用智慧和权威!)。

    谢谢你的时间!

    1 回复  |  直到 4 年前
        1
  •  2
  •   marsze    4 年前

    在我看来很好。虽然你可能应该把它重命名为 GetTargetTypes() 或将其作为财产:

    public abstract class CharacterController : MonoBehaviour, ICharacter
    {
        public virtual TargetTypes TargetTypes => TargetTypes.Character;
    }
    
    public class PlayerController : CharacterController, IPlayer
    {
        public override TargetTypes TargetTypes => base.TargetTypes | TargetTypes.Player;
    }
    

    注意:如果您为枚举名和成员名提供相同的名称(这是一个 common practice .)