泛型接口可以公开同名但差异#签名参数的方法

本文关键字:参数 方法 泛型接口 | 更新日期: 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();
        }
    }

但我想说的是,这种设计的用法也很少见。