【发布时间】:2017-12-11 02:57:23
【问题描述】:
我确信我根本不知道我正在尝试做的事情的名称,否则我的谷歌搜索会更成功。我目前只找到与具有相同命名方法的接口有关的结果。
我有几个类继承自一个通用基类,一些实现了一个接口。我有接受基类或接口作为参数的方法。我无法编译,因为这会导致错误的歧义
以下方法或属性之间的调用不明确:DoThings(IQueryable) 和 DoThings(IQueryable)` 在 ConcreteExecutionClass 中的调用。
此外,泛型将不起作用,因为泛型上的类型约束不会产生唯一的方法签名。
有没有办法(或可接受的模式)根据参数类型强制执行到特定方法?
public abstract class A {
// some properties
}
public class ConcreteA : A {
// full implementation
}
public interface B {
// a property
}
public class ConcreteAB : A, B {
// full implementation
}
public abstract class ExecutionClass {
public IQueryable<A> DoThings(IQueryable<A> content){
return A.method().AsQueryable();
}
public IQueryable<B> DoThings(IQueryable<B> content){
return B.interfaceRequiredMethod().method().AsQueryable();
}
}
public class ConcreteExecutionClass : ExecutionClass {
public void Program(){
var objectList = new List<ConcreteAB>{/*....*/};
DoThings(objectList);
}
}
每个具体类都有一个类来管理对象列表上的 linq 查询,每个对象列表都调用 DoThings()。目标是保持DoThings() 的实际实现对具体类透明。
我曾尝试在接口中使用协变,但无法避免继承 A,这会迫使第一个代码路径关闭。
上面的代码是对实际实现的简化。大约有 10 个类仅源自 A,而 4 个类源自 A 和 B。
【问题讨论】:
-
您希望为
ConcreteAB调用哪种方法?为什么? -
@Ryu 那篇文章是我说泛型不起作用的原因
-
我想调用 DoThings(B) 然后你可以输入 cast it ,完全没问题。由于存在歧义,您当然可以使用类型转换帮助运行时解决此问题。
-
我正在用我的手机阅读这篇文章,所以也许我在这里遗漏了一些关键的东西,但在我看来,一个显式的接口实现应该可以解决这个问题。
标签: c# methods interface ambiguous