2

私が何かを持っているなら

class square : figure {}

class triangle : figure {}

つまり、正方形と三角形のクラスを使用してはならず、図のみを参照する必要があるということですか?

決してこのようにしないように:

var x = new square();
4

2 に答える 2

6

あなたの場合、LSPは、継承されたすべての動作がaまたはfigureに適切であることを意味します。したがって、のセッターは必要ありません。また、のセッターは意味がないためです。squaretrianglefigure.Side1Side2Side3square

ある時点で、squareまたはを参照する必要triangleがありますが、実行していることがサブクラスに固有である場合に限ります。すべての図に等しく適切に適用される動作(おそらくDrawメソッド)を実装している場合は、またはfigureではなくパラメーターを受け入れる必要があります。squaretriangle

例として、クラスは次のように設定されます。

abstract class figure
{
    abstract void draw();
}

class triangle : figure
{
    void draw()
    {
        // ...
    }
}

class drawer
{
    void call_draw(figure fig)
    {
        fig.draw();
    }
}

仮想である限りfigure.draw()、つまり、その実装をサブクラスでオーバーライドできる(またはオーバーライドする必要がある)限り、オブジェクトがとして使用されている場合でも、triangleの動作を実行できます。draw()figure

于 2009-10-05T13:07:25.160 に答える
2

squareおよびクラスを定義し、triangleそれらのメソッドを実装する必要があります。また、次のように、それらを構築できる必要があります。

var x = new square();

他のすべてではないにしても、ほとんどの場合、基本クラスを使用する必要がありsquareますtrianglefigure.

LSPに関しては、これはfigureパラメータとして受け取る他のクラスの他のメソッドを指します。

other_method(figure fig);

このメソッドは、実際にasquareまたはtriangleインスタンスが渡されたかどうかに関係なく、動作に満足している必要があり、動作するために実際のクラスを検出しようとする必要はありません。

于 2009-10-07T09:31:06.810 に答える