我需要使用两个自定义文件读取器类之一; 一个读取固定宽度文件,一个读取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();
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是定义一个基类,然后覆盖工厂.我想问题是静态类属于基类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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:为了进一步澄清,我正在尝试做的是在我的基类中放置一些常用功能,但为我的特定于文件格式的方法定义一个接口.某些方法很常见,但构造函数的业务逻辑是特定于文件格式的.上面的代码可以工作,但在我看来,将基类工厂方法标记为虚拟,将派生类工厂方法标记为"覆盖"会更好.
我试图这样做,但得到"静态成员不能被标记为覆盖,虚拟或抽象".
实现目标的正确方法是什么?
首先,解释您的特定错误消息:您不能继承静态成员,因为它们属于所定义的类型,而不属于该类型的实例.诸如override,virtual和abstract之类的继承修饰符不适用于静态成员.
第二:
通常,当您遵循工厂模式时,您有一个工厂类,其工作是实例化具体类并返回转换为基类或接口的实例.关于工厂如何选择实例化的具体类别的细节各不相同,我不会深入研究,但从根本上讲,这就是工厂所做的事情.
因此,为了创建一个使用你提供的例子工厂模式,你需要至少四种类型,其中,以下你的榜样,很可能被命名为ReaderBase
,ReaderFactory
,CsvReader
,和FixedWidthReader
.而不是ReaderBase
,您可能会考虑IReader
- 选择取决于您的抽象类是否预先实现了所有共享的任何功能Readers
.
CsvReader
和FixedWidthReader
继承从任一IReader
或ReaderBase
,并ReaderFactory
具有所谓的至少一个方法,例如,InstantiateReader
,它返回一个IReader
或ReaderBase
.InstantiateReader
是否根据某些外部标准确定是否实例化a CsvReader
或a FixedWidthReader
.