7

未使用のメソッドを持つクラスからの継承は、インターフェイス分離の原則に違反しますか?

例えば:

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);
    }
}

Concretemethod に依存しますBase.Receive(int n)が、決して使用しません。

UPD

私が使用する定義:

ISP は、クライアントが使用しない方法に依存することを強制されるべきではないと述べています。

4

2 に答える 2

0

私が用語を使用する方法で、Concrete が Base.Receive() に「依存」しているとは思いません。Receive が変更された場合、Concrete はどのように変更する必要がありますか? 私はまったくそうではないと主張します。Receive() を別の名前または別の署名のメソッドに置き換えたと仮定すると、Concrete は認識しません。Concrete は Receive() を呼び出しますか? いいえ、ここでは Receive() に依存していません。

依存関係は署名 OnMsg() にあり、Concrete は Base との非常に特定の関係に参加し、その OnMsg() 契約を履行します。

しかし別の意味では、Concrete は Base.Receive() に大きく依存しています。これは、外界へのインターフェイスです。このメソッドがなければ、誰も Concrete の機能にアクセスできません。この意味で、Concrete は非常に基本的なレベルで Base.Receive() を「使用」します。

于 2013-07-10T07:45:47.190 に答える