【发布时间】:2011-12-12 19:08:06
【问题描述】:
我需要使用两个自定义文件阅读器类之一;一种用于读取固定宽度的文件,另一种用于读取 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();
}
}
我想要做的是定义一个基类,然后覆盖工厂。我想问题是静态类属于基类,所以永远不能被覆盖,即使它们是继承的。此代码有效
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;
}
}
编辑:为了进一步澄清,我想做的是在我的基类中添加一些通用功能,但为我的文件格式特定方法定义一个接口。其中一些方法很常见,但构造函数的业务逻辑是特定于文件格式的。我上面的代码有效,但在我看来,最好将基类工厂方法标记为虚拟,将派生类工厂方法标记为“覆盖”。
我尝试这样做,但得到“静态成员不能标记为覆盖、虚拟或抽象”。
实现我的目标的正确方法是什么?
【问题讨论】:
-
代码,代码,给我们看一些代码!
-
显示一些代码,但感觉您正试图在派生类中覆盖您的工厂方法?那会破坏工厂模式的目的......
-
嗯,是的,这正是我想要做的。不过,稍微想一想,我想你说得有道理(Eric J)——无论如何,我必须在我的代码中更改那个位置才能调用继承类的工厂方法,所以我可以一次性调用工厂方法...