接口中重载的方法

时间:2011-01-26 05:43:00

标签: c# oop interface c#-3.0

我今天的问题:界面中的重载方法是不是很糟糕?你知道,“省略参数,如果你不在乎,我们将找出默认值”的重载方法。 像那样:

void Add(object item); 
void Add(object item, bool shouldDoSomething); 
void Add(object item, bool shouldDoSomething, IUltraObscureDeviceContext context);

在这种情况下,我倾向于认为只有后者属于一个接口而其他应该在它上面的抽象类中实现。但话说回来,我不确定。

此外,有些时候你只是想要不同的重载做一些稍微不同的工作(如果不应该使用重载方法那么就停在那里)。或者有时你不能只用空格代替某些参数,你想要在某些东西为空时抛出异常。在这种情况下,我不应该使用重载吗?

所以基本上我正在寻找关于接口中重载方法的一些指导与实现这些接口的抽象类中的重载方法等等。 提前致谢

3 个答案:

答案 0 :(得分:8)

如果默认值取决于方法调用的接收者,则将它们声明为接口方法。

如果默认值只是默认值而与接收者无关,则创建各种reduce-argument-list重载作为扩展方法,并使实现者不必担心必须自己提供所有重载。

如果您正在处理某些非常严格的80/20规则异常,其中与实现无关的默认值几乎但不完全总是足够的,那么您有几个选项,其中没有一个是那么好:

  • 处理它就像它们总是不同,将它们声明为接口方法,并在任何地方重新实现它们。不是很干。
  • 处理它就像它们总是不同,将它们声明为接口方法,并继承提供80%默认实现的基类。有点笨拙,如果你的唯一基础级插槽已被占用,那就不好了。
  • 创建包含这些特定方法的另一个界面。使用与原始接口匹配的签名声明扩展方法。在扩展方法中,as - 将this参数强制转换为新的接口类型,如果匹配,则在那里调用它,否则填写库存默认值。非常时髦,依赖于动态强制转换,因此在内部循环中不是很好,但它将实现者和调用者的默认值分离,而不会牺牲不能采用“默认默认值”的实现者的灵活性。

答案 1 :(得分:1)

如果接口的设计需要,接口中的重载方法可能没问题。我个人从来不需要这样做。

我不会在界面中定义默认参数值。这是一个实现细节,实现了选择浮出水面的类。

你评论有关重载的不同实现....

不要那样做。可以将这些重载方法的实现视为调用一个方法,该方法具有使用某些默认值定义的所有参数。这就是代码用户期望事物的方式。

如果您需要不同的行为,请使用多态。这就是它的用途。

答案 2 :(得分:0)

IMO如果界面/合同拼出来,应该没有问题。然而,目标是在暴露界面并隐藏细节时简化操作。那些可选参数就派上用场了。像Python这样的面向对象的语言甚至没有超载AFAIK