【问题标题】:Implementing an interface which inherits from two interfaces with the same method实现一个接口,该接口继承自两个具有相同方法的接口
【发布时间】:2020-12-09 00:29:16
【问题描述】:

我的项目有很多接口,计算方法重叠:

    public interface Interface1
    {
        public double CalcStuff( int x );
    }

    public interface Interface2
    {
        public double CalcStuff( int x );
    }

    public interface InterfaceJoined : Interface1, Interface2
    {
    }

    public class ClassJoined : InterfaceJoined
     {
        public double CalcStuff( int x ) { return x*x; }
    }


    

我希望实现类可以分配为所有三个接口Interface1, Interface2, InterfaceJoined

        Interface1 calculator1 = new ClassJoined( );

        Interface2 calculator2 = new ClassJoined( );

        InterfaceJoined calculatorJoined = new ClassJoined( );

        double result1 = calculator1.CalcStuff( 20 ); // works

        double result2 = calculator2.CalcStuff( 20 ); // works

        double resultJoined = calculatorJoined.CalcStuff( 20 ); // "the call is ambiguous between the following methods or properties"

我希望接口具有相同的实现。这里无需区分。我怎样才能做到这一点?这整个想法是糟糕的设计吗?

谢谢和问候。

【问题讨论】:

  • 你可以明确地知道哪个实现是针对哪个接口的:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • 我在您的链接中找不到公共接口 InterfaceJoined : Interface1, Interface2 的情况。
  • 你想做的事,正如你所说的,是行不通的。错误信息非常清楚。如果你是编译器,你会执行哪一个?您可以随机选择一个版本,也可以在发生时抛出异常,因为调用不明确。您假设它具有完全相同的实现,但是您可以在每种方法中做一些不同的事情(显式实现),即使这没有意义,也没有什么能阻止您,因此编译器无法在这里做出假设。
  • 也许反过来:您可以提取常用方法来分离基本接口并从中派生现有接口,即interface ICalcStuff { double CalcStuff(int x); } 然后interface Interface1 : ICalcStuff { } interface Interface2 : ICalcStuff { }class ClassJoined : Interface1, Interface2 { }跨度>
  • 是的,这是可能的,但最终会形成一个很大的接口继承树,因为我经常遇到这种情况。

标签: c# interface multiple-inheritance


【解决方案1】:

我唯一能想到的是将接口的显式默认方法实现与通过new 关键字隐藏Interface1.CalcStuffInterface2.CalcStuff 方法相结合:

public interface InterfaceJoined : Interface1, Interface2
{
    double Interface1.CalcStuff(int x) => CalcStuff(x);
    double Interface2.CalcStuff(int x) => CalcStuff(x);
    new double CalcStuff(int x);
}

【讨论】:

    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2010-12-13
    • 2011-01-23
    相关资源
    最近更新 更多