我有这个界面:
public interface INameScope
{
void Register(string name, object scopedElement);
object Find(string name);
void Unregister(string name);
}
但我希望我的实现方法有不同的名称。我的实现已经有了一个具有另一种含义的Register方法。
是否有一种方法可以使实现的方法具有类似" RegisterName"," FindName"或" UnregisterName"而不是必须使用相同的名称?
答案 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
当对桥的一侧进行更改时,您需要在桥中进行相应的更改以重新开始工作。