0

当您有一个基类和两个扩展该基类的类并且只有一个派生类与另一个对象有关系时,如何对域进行建模。

例子:

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){...}
}  

这个模型是否违反了 Liskov 原则?我认为是因为与 class3 的这种关系,所以我们必须弄清楚如何在没有这种关系的情况下建模或将这种关系移动到 Base。如果我有一部分程序处理 Class2 来处理与 Class3 的关系,我无法使用基类而不强制转换为 class2。

这个想法对吗?

澄清...

让我们在学习模型中思考。我们有课程和课程班。我们还可以开设在线课程和预科课程。在presencial 课程中,我们可能会面临这种培训的费用。因此,成本只对现有环境有意义。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
    }
}

现在我必须处理成本,直到现在,presencial 课程对我来说并不重要,但现在,成本只对 presencial 环境有意义。

我的问题是:我需要处理成本模块中的 CourseClass 对象,因为我需要一些 courseClass 的东西,但是成本的关系与 RangeCourseClass 因为 QuantitativeCourseClass 对 prensecial 环境没有意义。

关于 liskov 的问题是关于如何说服我的团队对这个模型进行一些修改。

4

3 回答 3

1

如果 class3 与 base 无关,那么它不应该在 base 中。您不能“破坏” LSP,因为编译器会强制执行它。向下转换不是首选,但这样做不会破坏 LSP。

继承的目的是建立“is-a”关系。猫是-a(n) 动物。丰田就是汽车。

你所说的只是因为你想让事情变得更容易,所以将丰田标志移到汽车类。这根本不是好的设计。

简而言之,将事物转移到基类比向下转换到特定类更糟糕的设计。

于 2012-03-16T15:33:24.600 回答
0

据我了解,在不了解问题方面(例如几何)的情况下,您无法查看问题。所以,我无法理解你的架构的含义。例如,著名的 LSP 违规示例:Square:Rectangle - 当它站在“侧面”时,它看起来很好。但是,当您开始使用并放置一些功能时,您会发现问题。

于 2012-05-10T07:48:26.857 回答
0

我认为你混淆了 LSP(Liskov Substitution Principle)的方向:LSP 是(强)行为子类型,而不是强行为超类型。所以 LSP 不是针对您的示例,而是针对您的示例:

这个模型是否违反了 Liskov 原则?我认为是因为与 class3 的这种关系,所以我们必须弄清楚如何在没有这种关系的情况下建模或将这种关系移动到 Base。如果我有一部分程序处理 Class2 来处理与 Class3 的关系,那么如果不强制转换为 class2,我就无法使用基类。

您的模型没有破坏 LSP。如果您有一部分程序使用了一些专门处理 Class2 的变量 var(即 Base 中不存在的部分),您需要将 var 声明为 Class2。所以没有必要沮丧。LSP 也保证 var 的行为与 Base 一样,因此也不需要显式向上转换。

于 2012-03-16T16:40:27.040 回答