簡體   English   中英

改進此通用抽象類

[英]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.

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