【发布时间】:2020-07-02 17:58:29
【问题描述】:
我正在努力解决 C# 中的方法重载问题。
我有几个类继承自一个通用类
// I can not touch the implementation of these classes
class GenericDataType {}
class ProductDataType : GenericDataType {}
class ContentDataType : GenericDataType {}
还有一个类,它有一个迭代这些类列表的方法。 该方法的行为应该根据循环当前消耗的项目类型而有所不同
class DataTypeParser {
public List<ParserdType> parseAll(List<GenericDataType> list) {
var resultList = new List<ParserdType>();
foreach(var item in list) {
// if item is a ProductDataType do something
// if item is a ContentDataType do something else
// else do some generic stuff...
// then add to resultList the current processed item
}
}
}
我认为最自然的方法是在GenericDataType中添加一个虚方法,然后在子类中添加该方法的实现,但是除了DataTypeParser之外,我无法触及任何类。
我不想在代码中添加一堆 if else,我宁愿使用一些多态的东西来轻松处理该 GenericDataType 的不同实现。
所以我的解决方案是在 DataTypeParser 中添加一些重载方法
class DataTypeParser {
public List<ParserdType> parseAll(List<GenericDataType> list) {
var resultList = new List<ParserdType>();
foreach(var item in list) {
var parsed = parse(item);
if(parsed != null){
resultList.Add(parsed);
}
}
}
public ParserdType parse(ProductDataType o){
// do something
// ...
return new ParserdTypeProduct();
}
public ParserdType parse(ContentDataType o){
// do something else
// ...
return new ParserdTypeContent();
}
public ParserdType parse(GenericDataType o){
return null;
}
}
但它不起作用,因为 C# 似乎只调用具有泛型参数的函数。
我错过了什么?
我是个菜鸟,尤其是对于 C#,所以我很容易错过一些重要的东西,即使是一些链接也可能很有帮助。
【问题讨论】:
-
您正在寻找“双重调度”,这可能应该与stackoverflow.com/a/45053773/477420 重复,但我不知道是否可以建立这种联系。
-
do something和do something else有何不同?它们是否处理 GenericDataType 或其子类的任何属性? -
据我所知,显而易见的选择是@AlexeiLevenkov 提到的“双重调度”使用反射,或者实现一个可以使用
foreach(var type in IDataType){ type.parse(); }的接口 -
@Chetan Ranpariya 解析方法应该在
DataTypes 和打印ParserdTypes 的视图之间建立一座桥梁 -
C# 解决方案(如链接所示)是
var parsed = parse((dynamic)item);或者如果您不喜欢它的成本/魔力,John Wu 建议是非常标准的方法。
标签: c#