0

基本クラスとこの基本クラスを拡張する2つのクラスがあり、派生クラスの1つだけが別のオブジェクトとの関係を持っている場合に、ドメインをモデル化する方法。

例:

public abstract class Base  
{  
    public abstract void method();  
}

public class1 extends Base  
{
    public void method()
    {
         do some stuff
    }
}

public class2 extends Base  
{
    private Class3 class3;       

    public void method()
    {
         do other stuff
    }

    public Class3 getClass3(){...}

    public void setClass3(Class3 class3){...}
}  

このモデルはリスコフの原則を破っていますか?class3とのこの関係のためにそう思うので、この関係なしでモデル化する方法、またはこの関係をBaseに移動する方法を理解する必要があります。Class3との関係を処理するためにClass2を処理するプログラムの一部がある場合、class2にキャストしないと基本クラスを操作できません。

これは正しい考えですか?

明確にする...

学習モデルで考えてみましょう。コースとコースクラスがあります。オンラインコースやプレセンシャルコースもあります。プレセンシャルコースでは、このトレーニングの費用に直面する可能性があります。したがって、コストは実在する環境にのみ意味があります。CourseClassesには、範囲の日付または定性的な日付を含めることができます。

今日私はこのモデルを持っています:

Course
{
    ...
}

public abstract class CourseClass
{
    private Course course; 

    // getter and setter to course

    public abstract Enrollment enroll(Person student);
}

public class QuantitativeCourseClass
{
    public Enrollment enroll(Person student)
    {
        // enroll for quantitative
    }
}

public class RangeCourseClass
{
    public Enrollment enroll(Person student)
    {
        // enroll for range
    }
}

今、私はコストに対処する必要があり、この瞬間まで、プレゼンスのコースは私にとって重要ではありませんが、今では、コストはプレゼンスの環境にのみ意味があります。

私の問題は次のとおりです。courseClassのいくつかのものが必要なため、コストモジュールでCourseClassオブジェクトを処理する必要がありますが、QuantitativeCourseClassは財務環境に意味がないため、コストの関係はRangeCourseClassとの関係です。

リスコフについての質問は、このモデルにいくつかの変更を加えるために私のチームをどのように説得するかについてです。

4

3 に答える 3

1

class3がbaseとは何の関係もない場合は、baseに含めるべきではありません。コンパイラがLSPを強制するため、LSPを「壊す」ことはできません。ダウンキャストは好ましいものではありませんが、そうしてもLSPが破損することはありません。

継承の目的は、「is-a」関係を持つことです。猫は-a(n)動物です。トヨタは-車です。

あなたが話しているのは、物事を簡単にしたいという理由だけで、トヨタのエンブレムを車のクラスに移動することです。それはまったく良いデザインではありません。

つまり、特定のクラスにダウンキャストするよりも、基本クラスに移動する方が設計が悪くなります。

于 2012-03-16T15:33:24.600 に答える
0

LSP(Liskov Substitution Principle)の方向性を混同していると思います。LSPは(強力な)行動のサブタイピングであり、強力な行動のスーパータイピングではありません。したがって、LSPはあなたの例に対して機能していませんが、あなたの例に対しては機能しています。

このモデルはリスコフの原則を破っていますか?class3とのこの関係のためにそう思うので、この関係なしでモデル化する方法、またはこの関係をBaseに移動する方法を理解する必要があります。Class3との関係を処理するためにClass2を処理するプログラムの一部がある場合、class2にキャストしないと基本クラスを操作できません。

あなたのモデルはLSPを壊していません。Class2を具体的に処理する変数varを使用するプログラムの一部(つまり、Baseに存在しない部分)がある場合は、varをClass2であると宣言する必要があります。したがって、ダウンキャストは必要ありません。また、LSPは、varがBaseとしても動作することを保証しているため、明示的なアップキャストも必要ありません。

于 2012-03-16T16:40:27.040 に答える
0

私が理解しているように、問題の側面(たとえば、ジオメトリ)を知らなければ、問題を表示することはできません。だから、あなたの建築の意味がわかりません。たとえば、有名なLSP違反の例:Square:Rectangle-「横」に立つと問題なく見えます。しかし、使い始めていくつかの機能を配置すると、問題がわかります。

于 2012-05-10T07:48:26.857 に答える