【发布时间】: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