处理继承类中参数的最佳方式
本文关键字:最佳 方式 参数 继承 处理 | 更新日期: 2023-09-27 18:19:55
我有一个基类ExportType
和几个实现特定数据导出的继承类。
继承的类需要几个参数来定义从数据库导出数据的方式。这些参数可能因类而异。
因此,我想使用Dictionary<string, string>
来处理导出参数,并在我的基类中放入了这样一个方法:
public abstract void Export (Dictionary<string, string> exportParams);
这是最好的方法吗,还是有更好的方法来处理不同的参数?
由于您无法确定特定导出类型需要什么参数,因此您有几个选项:
- 使用字典(就像您建议的那样):可扩展,但没有类型安全
- 为接口使用基类:仍然没有类型安全性,因为您需要在每个特定的导出方法内部进行强制转换
- 使参数实现特定并对调用方隐藏:首选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的答案。