【问题标题】:OO Design ModelingOO设计建模
【发布时间】:2012-05-10 15:48:26
【问题描述】:

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

例子:

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 的问题是关于如何说服我的团队对这个模型进行一些修改。

【问题讨论】:

  • 你能提供一个更具体的例子吗?据我所知,您并没有破坏 LSP。请注意,您可能正在处理 Class3,但它与“Base”没有任何关系。它仍然是一个 Base 对象加上它自己的其他方法。这仅取决于客户端类是否需要“Base”或“Class2”对象
  • 您似乎忘记了 extends 关键字。另外,我仍然不确定 Quantitative 和 Range 的含义以及它们与成本和“presenciality”的关系。您还可以在代码中包含成本。
  • 您的澄清似乎没有帮助,因为您忘记了许多说明您的问题的事情。您的对象不会从其他任何东西继承,并且您没有定义“presencial”的含义。

标签: oop model data-modeling liskov-substitution-principle


【解决方案1】:

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

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

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

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

【讨论】:

  • 我并不想将 Class3 房地产转移到基类,我知道这是一件坏事。我真正的问题是在“澄清”模型中(对不起,我尽我所能举例说明)。成本与 RangeCourseClass 相关,但我需要处理 CourseClass 对象,在这种情况下,我需要对 RangeCourseClass 使用 instanceof。这就是问题所在。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2012-10-16
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      相关资源
      最近更新 更多