![](/img/trans.png)
[英]C#: How do I call a static method of a base class from a static method of a derived class?
[英]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)不适用于静态成员。
第二:
通常,当您遵循工厂模式时,就有一个工厂类,其工作是实例化具体类并返回那些转换为基类或接口的实例。 关于工厂如何选择要实例化的具体类的细节有所不同,我将不予讨论,但是从根本上讲,这就是工厂的工作。
因此,为了使用提供的示例创建工厂模式,您至少需要四种类型,在您的示例之后,这些类型可能被命名为ReaderBase
, ReaderFactory
, CsvReader
和FixedWidthReader
。 您可以考虑使用IReader
而不是ReaderBase
,它的选择取决于您的抽象类是否预先实现了所有Readers
共享的任何功能。
CsvReader
和FixedWidthReader
继承自IReader
或ReaderBase
,并且ReaderFactory
至少具有一个称为InstantiateReader
,该方法返回IReader
或ReaderBase
。 InstantiateReader
会根据一些外部条件来确定是实例化CsvReader
还是FixedWidthReader
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.