簡體   English   中英

隱藏的繼承c#

[英]Hidden Inherritance 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上使用“密封”將不起作用(它是抽象的, RangedAbilityMeleeAbility需要從中繼承)。 這兩個子類“模仿”繼承的反射方法將非常繁瑣,並且必須在MeleeAbilityRangedAbility中都RangedAbility 完全放棄使用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測試更整潔地確定了您擁有的IsSubClassOf 。或者,再次提供更好的功能來提供這樣的功能,通過內部抽象方法進行測試)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM