向界面添加新功能

fle*_*her 9 c# overloading interface

我需要为现有接口上的函数创建重载,而不会影响当前实现或使用接口的任何组件(理想情况下).

我想我有几个选择:

简化原始界面:

public interface IServerComponent
{
    bool Add(int a, int b);
}
Run Code Online (Sandbox Code Playgroud)

我可以将新的重载函数添加到接口并强制实现接口的每个类来实现新函数.

public interface IServerComponent
{
    bool Add(int a, int b);
    bool Add(int a, int b, int c);
}
Run Code Online (Sandbox Code Playgroud)

或者我可以创建一个实现原始界面的新界面.然后,其他使用原始类的类将不需要更改,任何新类都可以实现新接口...

public interface IServerComponent2 : IServerComponent
{
    bool Add(int a, int b, int c);
}
Run Code Online (Sandbox Code Playgroud)

这种情况最好的做法是什么?还有其他选择吗?

谢谢

Ste*_*ary 12

如果新方法可以用旧方法表示,则可以使用扩展方法:

// Original interface
public interface IServerComponent 
{ 
  bool Add(int a, int b, int c); 
} 

// New overload
public static class MyServerMethods
{
  public static bool Add(this IServerComponent component, int a, int b)
  {
    return component.Add(a, b, 0);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果方法不能这样表达(即,它们确实需要由组件本身实现),那么我建议定义一个新的接口.此方法具有最大的向后兼容性.

  • 这完全取决于设计.如果您要添加*新功能*,那么我会同意; 它属于一个接口.如果你要添加*重载*(例如,几乎相同的功能,总是可以表达其他功能),那么我不同意.在这种情况下,扩展方法允许*正交*,减少代码重复.[乔·达菲(http://www.bluebytesoftware.com/blog/2010/02/10/ExtensionMethodsAsDefaultInterfaceMethodImplementations.aspx)对这个问题的好博客文章. (2认同)

dtb*_*dtb 5

如果您的 IServerComponent 接口尚未发布或者是仅由您自己的类实现的内部接口,并且新接口成员对于实现该接口的所有现有类都有意义,请更改现有接口。

否则,创建一个扩展 IServerComponent 的 IServerComponent2 接口。IIRC 这是框架设计指南所建议的。可以在 .NET Framework 中以X509Certificate2类的形式找到这样的示例。

但是,如果新成员可以按照原始成员来实现,则还可以使用扩展方法

public interface IServerComponent
{
    bool Add(int a, int b);
}

public static class ServerComponentExtensions
{
    public static bool Add(this IServerComponent isc, int a, int b, int c)
    {
        return isc.Add(a, b) && isc.Add(b, c) && isc.Add(c, a);
    }
}
Run Code Online (Sandbox Code Playgroud)