【问题标题】:Interface vs Class method parameter ambiguity接口与类方法参数歧义
【发布时间】: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 个类源自 AB

【问题讨论】:

  • 您希望为ConcreteAB 调用哪种方法?为什么?
  • @Ryu 那篇文章是我说泛型不起作用的原因
  • 我想调用 DoThings(B) 然后你可以输入 cast it ,完全没问题。由于存在歧义,您当然可以使用类型转换帮助运行时解决此问题。
  • 我正在用我的手机阅读这篇文章,所以也许我在这里遗漏了一些关键的东西,但在我看来,一个显式的接口实现应该可以解决这个问题。

标签: c# methods interface ambiguous


【解决方案1】:

我只是创建了一个抽象层次结构,其中抽象 A 是基础,并且有 2 个抽象类继承自它。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    相关资源
    最近更新 更多