泛型接口可以公开同名但差异#签名参数的方法
本文关键字:参数 方法 泛型接口 | 更新日期: 2023-09-27 18:34:18
我正在尝试解码这个相当复杂的程序。
有一个名为 IInterface_1 的通用接口。它公开了一个方法"MethodName",该方法签名中有一个参数。
public interface IInterface_1<S> where S : class, "ISomeClass", new()
{
S MethodName(IEnumerable<Ilistname> Name);
}
我希望继承IInterface_1的任何泛型类或接口都必须提供实现方法"MethodName"的实现或路径。如图所示,方法名称在方法签名中有一个参数。
但是,在程序的其他地方,相同的方法名称由另一个接口"IInterface_2"公开,其中方法签名中不是一个而是两个参数。 在这两种情况下,约束是相同的,但IIinterface_2从IInterface_1继承。
public interface IInterface_2<S> : IInterface_1 where S : class, "ISomeClass", new()
{
S MethodName(IEnumerable<Ilistname> Name, ISomethingElse Name_2);
}
IInterface_2来自IInterface_1,但IInterface_2和IInterface_1公开相同的方法,但参数数量不同。根据我对接口的了解,上述内容会违反接口"合同",但该程序运行良好。我错过了什么?
谢谢汤姆
拥有这种接口组合的好处是,当你的某些类实现IInterface_1
它只需要实现S MethodName(IEnumerable<Ilistname> Name);
如果它正在实现IInterface_2
它需要同时实现两者
S MethodName(IEnumerable<Ilistname> Name);
S MethodName(IEnumerable<Ilistname> Name, ISomethingElse Name_2);
因此,当您在应用程序中使用由IInterface_2
某人抽象的对象时,您应该能够调用这两种方法。
它也不是任何 C# 语法规则。您描述的接口具有不同的名称。上述两种方法的名称相同,但参数集不同。
即使它们具有相同的参数,它也可能是有效的 C# 代码。尝试以下程序并检查写入控制台的内容。
public interface IBasicInterface
{
int Test();
}
public interface IAdvancedInterface : IBasicInterface
{
int Test();
}
public class AdvancedClass : IAdvancedInterface
{
int IBasicInterface.Test()
{
return 1;
}
int IAdvancedInterface.Test()
{
return 2;
}
}
class Program
{
static void Main(string[] args)
{
AdvancedClass tester = new AdvancedClass();
Console.WriteLine(((IAdvancedInterface)tester).Test()); // returns 2
Console.WriteLine(((IBasicInterface)tester).Test()); // returns 1
Console.ReadLine();
}
}
但我想说的是,这种设计的用法也很少见。