隐藏继承c#



在c#中,是否有可能阻止程序员继承父类,但允许从子类继承(也许只是在编写代码期间,而不是在运行时)?

例如:

//Class which should only allow 'RangedAbility' and 'MeleeAbility' to inherit. 
//No other classes are to be allowed to inherit from Ability
public abstract class Ability{ 
    public virtual void foo(){}
}
public class RangedAbility : Ability{
     //an empty class
}
public class MeleeAbility : Ability{
     //an empty class
}
public class myAbility : MeleeAbility{
     public override void foo(){ /*some code*/}
} 
//attempting to inherit from `Ability` instead of `MeleeAbility` or instead of 'RangedAbility' 
//should result in programmer facing an error in IDE such as Visual Studio.

Ability上使用"sealed"将不起作用(它是抽象的,以及RangedAbility, MeleeAbility需要继承它)。反射方法通过这两个子类来"模拟"继承将是非常繁琐的,必须在MeleeAbilityRangedAbility中完成。完全放弃Ability的使用,强迫RangedAbilityMeleeAbility实现一个接口似乎也不是一个好的选择,因为它们共享的方法最好是通过"隐藏"的父类编写一次。

做这样的代码的原因是,我需要在运行时确定什么样的行为期望从'myAbility'类型。它是通过IsSubclassOf(typeof(MeleeAbility))IsSubclassOf(typeof(RangedAbility))完成的,这允许在不需要myAbility的实际实例的情况下确定预期行为

public abstract class Ability
{
  internal Ability()
  {
  }
  public virtual void foo(){}
}

因为Ability的唯一构造函数是internal,所以只能构造来自同一程序集中的派生类(不显式构建在基构造函数上的构造函数是隐式: base())。在另一个程序集中直接从Ability派生类的任何尝试都没有有效的构造函数。

(与此相关的是,您可能会发现一个内部抽象属性,您自己的类覆盖它以返回不同的值,这是比执行显式IsSubClassOf甚至is测试更简洁的方法来确定您拥有哪些值。)或者更好的是,通过一个内部抽象方法提供任何开启这样一个测试的功能)。

相关内容

  • 没有找到相关文章

最新更新