C# 将函数添加到接口,而不在所有类中实现

C# 将函数添加到接口,而不在所有类中实现,c#,interface,C#,Interface,我的问题是,在C#中,如果我想在接口中添加另一个函数,但我不想在实现该接口的所有类中实现该函数。我怎样才能做到这一点?比如说 一个接口包含5个方法,该接口由20个类实现。现在我想在同一个接口中添加另一个方法,但我只想在5个类中实现该函数,而不是在15个类中实现?我怎样才能做到这一点 谢谢 public interface IWidelyUsed { ... } 这是由这20个类实现的 public interface IParticularCase : IWidelyUsed { ... }

我的问题是,在C#中,如果我想在接口中添加另一个函数,但我不想在实现该接口的所有类中实现该函数。我怎样才能做到这一点?比如说

一个接口包含5个方法,该接口由20个类实现。现在我想在同一个接口中添加另一个方法,但我只想在5个类中实现该函数,而不是在15个类中实现?我怎样才能做到这一点

谢谢

public interface IWidelyUsed { ... }
这是由这20个类实现的

public interface IParticularCase : IWidelyUsed { ... }

这将有另一个功能

简短回答:将大接口定义拆分为两个更专门的定义

背后的一些理论:
作为

的一部分,这与接口的本质相矛盾。如果接口
IBlob
定义了
void DoAThing()
,这意味着实现它的任何类都知道如何做一件事。这是合同。如果你想让你的
blob
中的一些人能够做一件事,而另一些人不能,那么你本质上是说做一件事不是
blob
的一个特征

现在,在某些情况下,您确实希望所有IBlobs都能公开DoAThing,但您不希望在那里发生任何事情。您需要一个默认的空实现。对于这些情况,我们可以在具体类和接口之间添加一个抽象基类:

interface IBlob
{
     void DoAThing();
}

abstract class AbstractBlob : IBlob
{
     virtual void DoAThing() { } // nothing happening.
}

class BlobThatDoesThings : AbstractBlob
{
     override void DoAThing() { DoSomething(); }
}

class RegularBlob : AbstractBlob
{
   // Inherits the abstract blob's implementation.
}

但是,在其他情况下,如果您确实只需要一些blob来实现一个方法,请使用BlackBear提到的接口专门化方法。

为什么不使用两个接口?这假设您需要两个接口之间的“耦合”。我不是说这是错误的,它可能是解决方案,但另一个接口也可能完全分离。@RaphaëlAlthaus您是对的。我认为这是解决方案,因为OP需要向接口添加一个方法,但只在某些类上实现它;这让我觉得他需要一个专门的界面