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声明不应该强迫任何客户端依赖它不使用的方法.
我认为你错误地解释了界面隔离原则所说的内容.在你的情况下你很好,并没有"强迫"任何实现.实际上,您正在应用模板方法设计模式
如果你有一个假设
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)