私が何かを持っているなら
class square : figure {}
class triangle : figure {}
つまり、正方形と三角形のクラスを使用してはならず、図のみを参照する必要があるということですか?
決してこのようにしないように:
var x = new square();
私が何かを持っているなら
class square : figure {}
class triangle : figure {}
つまり、正方形と三角形のクラスを使用してはならず、図のみを参照する必要があるということですか?
決してこのようにしないように:
var x = new square();
あなたの場合、LSPは、継承されたすべての動作がaまたはfigure
に適切であることを意味します。したがって、のセッターは必要ありません。また、のセッターは意味がないためです。square
triangle
figure.Side1
Side2
Side3
square
ある時点で、square
またはを参照する必要triangle
がありますが、実行していることがサブクラスに固有である場合に限ります。すべての図に等しく適切に適用される動作(おそらくDrawメソッド)を実装している場合は、またはfigure
ではなくパラメーターを受け入れる必要があります。square
triangle
例として、クラスは次のように設定されます。
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
square
およびクラスを定義し、triangle
それらのメソッドを実装する必要があります。また、次のように、それらを構築できる必要があります。
var x = new square();
他のすべてではないにしても、ほとんどの場合、基本クラスを使用する必要がありsquare
ますtriangle
figure.
LSPに関しては、これはfigure
パラメータとして受け取る他のクラスの他のメソッドを指します。
other_method(figure fig);
このメソッドは、実際にasquare
またはtriangle
インスタンスが渡されたかどうかに関係なく、動作に満足している必要があり、動作するために実際のクラスを検出しようとする必要はありません。