[英]Improve this generic abstract class
我有以下抽象類設計,我想知道是否有人可以就加強我們的要求的實施或簡化ControllerBase的實施提出任何改進建議。
//Dependency Provider base
public abstract class ControllerBase<TContract, TType> where TType : TContract, class
{
public static TContract Instance
{
get {
return ComponentFactory.GetComponent<TContract, TType>();
}
}
public TContract GetComponent<TContract, TType>() where TType : TContract, class
{
component = (TType)Activator.CreateInstance(typeof(TType), true);
RegisterComponentInstance<TContract>(component);
}
}
//Contract
public interface IController
{
void DoThing();
}
//Actual Class Logic
public class Controller: ControllerBase<IController,Controller>
{
public void DoThing();
//internal constructor
internal Controller(){}
}
//Usage
public static void Main()
{
Controller.Instance.DoThing();
}
以下事實應始終是真實的,
TType
應該始終實現TContract
(使用通用約束強制執行)
TContract
必須是一個接口(找不到強制執行的方法)
TType
不應只有公共構造函數, TType
應是內部構造函數,有沒有辦法使用ControllerBase
來強制執行該構造函數?
TType
必須是一個具體的類(由於構造函數應標記為Internal,因此不包含New()作為通用約束)
有一種方法可以將TType強制為具體類,並同時禁止構造函數成功。 我想也許可以嘗試實例化TType,只有當它是具體類型時才能成功,但是,您要避免實例化。 我建議嘗試從構造函數中引發異常。 在您的控制器庫中,您可以在實例化周圍加上異常處理代碼。 僅當實例化具體類型時,它才會通過編譯時;如果引發異常,則它將通過運行時...這是總體上的壞習慣(如果可能的話),我想您需要完全不同的設計才能達到您的期望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.