继承和接口隔离原则

ast*_*tef 6 c# inheritance solid-principles interface-segregation-principle

来自具有未使用方法的类的继承是否违反了接口隔离原则?

例如:

abstract class Base
{
    public void Receive(int n)
    {
        // . . . (some important work)

        OnMsg(n.ToString());
    }

    protected abstract void OnMsg(string msg);
}

class Concrete : Base
{
    protected override void OnMsg(string msg)
    {
        Console.WriteLine("Msg: " + msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

Concrete取决于方法Base.Receive(int n),但它从不使用它.

UPD

我使用的定义:

ISP声明不应该强迫任何客户端依赖它不使用的方法.

Pao*_*lla 7

我认为你错误地解释了界面隔离原则所说的内容.在你的情况下你很好,并没有"强迫"任何实现.实际上,您正在应用模板方法设计模式

如果你有一个假设

interface ICommunicateInt
{
  int Receive();
  void Send(int n);
}
Run Code Online (Sandbox Code Playgroud)

为了实现它,你的Base类将被迫实现Send它不需要的方法.因此,ISP建议最好:

interface ISendInt
{
  void Send(int n);
}

interface IReceiveInt
{
  int Receive();
}
Run Code Online (Sandbox Code Playgroud)

所以你的课程可以选择实施一个或两个.此外,其他类中需要可以发送Int的类的方法也需要a

void Test(ISendInt snd)
// void Test(ICommunicateInt snd) // Test would "force" snd to depend on 
                                  // a method that it does not use 
Run Code Online (Sandbox Code Playgroud)