簡體   English   中英

如何在C#中使用靜態工廠方法創建基類?

[英]How to create a base class with static factory method in C#?

我需要使用兩個自定義文件閱讀器類之一; 一個讀取固定寬度的文件,一個讀取CSV文件。 這些閱讀器中的每一個都將具有某些屬性,等等。我想使用工廠方法並擁有私有構造函數,因此我可以在創建對象之前運行一些業務邏輯。

編輯:更好的例子

//simple class with it's own factory method
class Class1
{
    private Class1()
    {
        //constructor code
    }
    public static Class1 CreateClass()
    {
        //do some business logic here
        return new Class1();
    }
}

我想要做的是定義一個基類,然后覆蓋工廠。 我想問題是靜態類屬於基本CLASS,因此即使繼承了它們也不能覆蓋。 此代碼有效

public class BaseClass
{
    //some common properties / fields here
    public string SomeField;

    //some common methods here

    //empty constructor
    protected BaseClass() { }

    //cannot have a virtual static class!  
    //Would really like to make this a virtual method
    public static BaseClass CreateClass() 
    {
        throw new NotImplementedException("BaseClass is meant to be derived");
    }

    public static string DoCommonStaticThing(){
        return "I don't know why you'd ever do this"; 
    }
}

public class DerivedClass1 : BaseClass
{
    //private constructor
    private DerivedClass1() {}

    //concrete factory method
    //would really like to say "override" here
    public static BaseClass CreateClass()
    {
        DerivedClass1 d1 = new DerivedClass1();
        d1.SomeField = "I'm a derived class\r\n" + DoCommonStaticThing();
        return d1;
    }
}

編輯:為了進一步闡明,我想做的是在我的基類中放一些通用功能,但是為我的文件格式專用方法定義了一個接口。 某些方法很常見,但構造函數的業務邏輯是文件格式特定的。 上面的代碼可以正常工作,但是在我看來,將基類工廠方法標記為虛擬,將派生類工廠方法標記為“覆蓋”會更好。

我試圖這樣做,但是得到了“靜態成員無法標記為替代,虛擬或抽象”。

什么是實現我目標的正確方法?

首先,解釋您的特定錯誤消息:您不能繼承靜態成員,因為它們屬於所定義的類型,而不是該類型的實例。 繼承修飾符(例如,override,virtual和abstract)不適用於靜態成員。

第二:

通常,當您遵循工廠模式時,就有一個工廠類,其工作是實例化具體類並返回那些轉換為基類或接口的實例。 關於工廠如何選擇要實例化的具體類的細節有所不同,我將不予討論,但是從根本上講,這就是工廠的工作。

因此,為了使用提供的示例創建工廠模式,您至少需要四種類型,在您的示例之后,這些類型可能被命名為ReaderBaseReaderFactoryCsvReaderFixedWidthReader 您可以考慮使用IReader而不是ReaderBase ,它的選擇取決於您的抽象類是否預先實現了所有Readers共享的任何功能。

CsvReaderFixedWidthReader繼承自IReaderReaderBase ,並且ReaderFactory至少具有一個稱為InstantiateReader ,該方法返回IReaderReaderBase InstantiateReader會根據一些外部條件來確定是實例化CsvReader還是FixedWidthReader

暫無
暫無

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

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