接口是否可以使用模板化方法名称?

时间:2014-11-12 05:37:39

标签: c# templates interface

我知道答案可能不是,但仍想确认。
接口可以有可变的方法名称吗?

之类的东西
Interface IVariableMethodName //something similar to <T>
{
   void T(int param);
   void T(string param);
}

我有一些类需要函数重载,对于具有完全相同参数但名称不同且具有不同功能的几个函数。有没有更好的方法这样做,而不是使用几乎相同的内容,除了方法名称?

编辑:一个例子

class Adder
{
    public int Add(int a, int b){}
    public float Add(float a, float b){}
    public decimal Add(decimal a, decimal b){}
}


class Subber
{
    public int Sub(int a, int b){}
    public float Sub(float a, float b){}
    public decimal Sub(decimal a, decimal b){}
}

我想要做的是类似于示例,唯一的区别是返回类型是类本身。这些方法的功能非常不同。

1 个答案:

答案 0 :(得分:0)

我仍然不确定我完全理解这个问题。但是,确定无法定义单个接口,接口成员可以根据实现类使用不同的名称。

鉴于底层目标是维护 - 即,如果某个类无法实现所有必要的方法,以确保编译时错误 - 在我看来,最接近的目标是声明一个接口使用通用方法名称,然后让每个特定类型通过委托实现该类型特定方法的接口。

例如:

interface IOperator
{
    int Operation(int a, int b);
    float Operation(float a, float b);
    decimal Operation(decimal a, decimal b);
}

class Adder : IOperator
{
    public int Add(int a, int b){}
    public float Add(float a, float b){}
    public decimal Add(decimal a, decimal b){}

    public int Operation(int a, int b) { return Add(a, b); }
    public float Operation(float a, float b) { return Add(a, b); }
    public decimal Operation(decimal a, decimal b) { return Add(a, b); }
}


class Subber : IOperator
{
    public int Sub(int a, int b){}
    public float Sub(float a, float b){}
    public decimal Sub(decimal a, decimal b){}

    public int Operation(int a, int b) { return Sub(a, b); }
    public float Operation(float a, float b) { return Sub(a, b); }
    public decimal Operation(decimal a, decimal b) { return Sub(a, b); }
}

不幸的是,这并不是保证每个类型都实现了有问题的类型特定方法。但它确实需要每个类型实现接口,如果您的团队中的开发人员通过某种方式在接口中实现新方法,而不是将相应的特定于类型的方法添加到类中然后调用它,那么手头有更大的问题。 :)

对我来说,这个界面实际上可能不会以接口通常的方式使用,即支持某些特定合同的多态实现,这似乎也是不幸的。但也许你一旦找到这样的东西就会发现,继续推广其他代码是有道理的。

就此而言,如果你达到这一点,也许你会发现只停止在每种类型中使用不同的方法名称编写这些类型更有意义,因为在不同的类型中,方法确实是基本相同。 :)