gpt4 book ai didi

c# - 如何在 C# 中使用静态工厂方法创建基类?

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:21 25 4
gpt4 key购买 nike

我需要使用两个自定义文件阅读器类之一;一种用于读取固定宽度的文件,另一种用于读取 CSV 文件。这些读者中的每一个都将具有某些属性等。我想使用工厂方法并拥有私有(private)构造函数,这样我就可以在创建对象之前运行一些业务逻辑。

编辑:更好的例子

//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;
}
}

编辑:为了进一步澄清,我正在尝试做的是在我的基类中放置一些通用功能,但为我的文件格式特定方法定义一个接口(interface)。一些方法是通用的,但构造函数的业务逻辑是特定于文件格式的。我上面的代码有效,但在我看来,将基类工厂方法标记为虚拟的,并将派生类工厂方法标记为“覆盖”会更好。

我尝试这样做,但得到“静态成员不能标记为覆盖、虚拟或抽象”。

实现目标的正确方法是什么?

最佳答案

首先,解释一下你的具体错误信息:你不能继承静态成员,因为它们属于被定义的类型,而不是类型的实例。 override、virtual 和 abstract 等继承修饰符不适用于静态成员。

第二个:

通常,当您遵循工厂模式时,您会有一个工厂类,其工作是实例化具体类并返回那些转换为基类或接口(interface)的实例。关于工厂如何选择要实例化哪个具体类的细节各不相同,我不会深入探讨,但在基本层面上,这就是工厂所做的。

因此,为了使用您提供的示例创建工厂模式,您至少需要四种类型,根据您的示例,它们可能被命名为 ReaderBaseReaderFactoryCsvReaderFixedWidthReader。您可能会考虑使用 IReader 而不是 ReaderBase - 选择取决于您的抽象类是否预先实现了所有 Reader 共享的任何功能.

CsvReaderFixedWidthReader 继承自 IReaderReaderBase,以及 ReaderFactory至少有一个方法,例如 InstantiateReader,它返回一个 IReaderReaderBaseInstantiateReader 根据一些外部标准确定是实例化 CsvReader 还是 FixedWidthReader

关于c# - 如何在 C# 中使用静态工厂方法创建基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7853427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com