簡體   English   中英

C#基類可以在靜態成員中調用子類的構造函數嗎?

[英]Can a C# base class call a sub class's constructor in a static member?

我有一個抽象的泛型類“BaseClass”和一個定義如下的類“SubClass”:

public class SubClass : BaseClass<SubClass>

我想在基類中定義一個靜態方法,簽名如下:

public static T GetSub() 

然后在子類上調用它,以便它返回子類的實例

SubClass sub = SubClass.GetSub();

GetSub必須調用SubClass的默認構造函數,然后返回實例。

這開始看起來有點瘋狂,但我至少很想知道這是否可行。 對於C#更復雜的OOP功能,我是一個新手,所以我真的只是在黑暗中拍攝。

這可以使這項工作成功,但這需要你做一些工作。 最簡單的方法是使這項工作是在BaseClass的聲明中賦予T new約束

abstract class BaseClass<T> where T : new() {
  public static T GetSub() {
    return new T();
  }
}

另一種方法是使用Activator.CreateInstance

abstract class BaseClass<T> {
  public static T GetSub() { 
    return Activator.CreateInstance<T>();
  }
}

功能上雖然這與原始方法沒有什么不同。 CreateInstance<T>方法將只查找無參數構造函數並調用它。 事實上, new T()調用通常會編譯為Activator.CreateInstance<T>調用。

這不行。 您必須在基類中創建一個虛方法,在每個子類中重寫並使其返回該子類的實例。
或者,您可以使用反射調用GetType()並使用Activator創建相應類型的實例。 通過這種方式,您只需要基類中的一個方法,但速度效率較低。

暫無
暫無

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

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