使用不同方法名称的接口实现

时间:2015-08-27 11:58:11

标签: c# .net oop

我有这个界面:

public interface INameScope
{
    void Register(string name, object scopedElement);
    object Find(string name);
    void Unregister(string name);
}

但我希望我的实现方法有不同的名称。我的实现已经有了一个具有另一种含义的Register方法。

是否有一种方法可以使实现的方法具有类似" RegisterName"," FindName"或" UnregisterName"而不是必须使用相同的名称?

2 个答案:

答案 0 :(得分:8)

不完全,但您可以使用explicit interface implementation

public class SomeScope : INameScope
{
    void INameScope.Register(string name, object scopedElement)
    {
        RegisterName(name, scopedElement);
    }

    public void Register(...)
    {
        // Does something different
    }

    public void RegisterName(...)
    {
        // ...
    }

    ...
}

如果您现有的Register方法具有相似的参数,我会非常谨慎 - 虽然编译器会对此感到满意,但您应该问自己它有多清楚对任何读你代码的人都是:

SomeScope x = new SomeScope(...);
INameScope y = x;
x.Register(...); // Does one thing
y.Register(...); // Does something entirely different

答案 1 :(得分:5)

方法实现与它们实现的接口方法的绑定是通过方法签名完成的,即名称和参数列表。实现具有方法Register的接口的类必须具有具有相同签名的方法Register。虽然C#允许您使用不同的Register方法作为显式实现,但在这种情况下,更好的方法是使用Bridge Pattern,这样可以让您连接"具有非匹配方法签名的实现的接口:

interface IMyInterface {
    void Register(string name);
}

class MyImplementation {
    public void RegisterName(string name) {
        // Wrong Register
    }
    public void RegisterName(string name) {
        // Right Register
    }
}

桥梁类"解耦"来自MyImplementation的{​​{1}},允许您单独更改方法和属性的名称:

IMyInterface

当对桥的一侧进行更改时,您需要在桥中进行相应的更改以重新开始工作。