处理继承类中参数的最佳方式

本文关键字:最佳 方式 参数 继承 处理 | 更新日期: 2023-09-27 18:19:55

我有一个基类ExportType和几个实现特定数据导出的继承类。

继承的类需要几个参数来定义从数据库导出数据的方式。这些参数可能因类而异。

因此,我想使用Dictionary<string, string>来处理导出参数,并在我的基类中放入了这样一个方法:

public abstract void Export (Dictionary<string, string> exportParams);

这是最好的方法吗,还是有更好的方法来处理不同的参数?

处理继承类中参数的最佳方式

由于您无法确定特定导出类型需要什么参数,因此您有几个选项:

  1. 使用字典(就像您建议的那样):可扩展,但没有类型安全
  2. 为接口使用基类:仍然没有类型安全性,因为您需要在每个特定的导出方法内部进行强制转换
  3. 使参数实现特定并对调用方隐藏:首选IMHO

如果您隐藏了导出到调用传递多态性的具体实现,那么您不应该期望他们知道您的内部参数。

我会将您的导出界面简化为:

interface IExport 
{
    void Export(); // or Export(string filename), alternatively
}

然后以您需要的方式实例化每个具体类:

// no params
IExport txt = new TextExport();
// single string (delimiter)
IExport csv = new DelimitedExport(",");
// lots of params
IExport excel = new ExcelExport(someStronglyTypedOptions);

这样,您的调用代码就不需要麻烦传递这些参数了。

[编辑]

总结一下:在没有其他明显好处的情况下,您可以通过重写以下内容来简单地解决参数类型的问题:

var csv = new ExcelExport();
csv.Export(parameters);

到此:

var csv = new ExcelExport(parameters);
csv.Export();

在某一点上,某人需要知道要实例化哪些参数以及如何实例化。这意味着其他人从那时起都可以接受IExport实例,并且只允许调用一个简单的无参数方法。

然后,您的具体实现将具有不同的构造函数,并且通常将遵循以下模式:

class ExcelExport : IExport
{
    private readonly ExcelParams _params;
    public ExcelExport(ExcelParams parameters)
    {
        _params = parameters;
    }
    public void Export() 
    {
        // do stuff
    }
}

根据它的调用方式,您可能能够使基类通用,接受您创建的参数类的类型。

public abstract class BaseClass<TExportParams>
{
    public abstract void Export(TExportParams exportParams);
}
public class Derived : BaseClass<DerivedExportParamsClass>
{
    public void Export(DerivedExportParamsClass exportParams)
    {
    }
}

如果您不知道要在调用Export时传递给它的参数类型,请使用@Groo的答案。