【发布时间】: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