当你有一个基类和两个扩展这个基类的类,并且只有一个派生类与另一个对象有关系时,如何对域进行建模。
示例:
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的这种关系,所以我们必须弄清楚如何在没有这种关系的情况下建模,或者将这种关系移动到基础上。如果我有一部分处理class2程序来处理与Class3的关系,我就不能在不强制转换为Class2的情况下使用基类。
这样的想法对吗?
澄清...
让我们在学习模型中思考。我们有课程和CourseClasses。我们也可以有在线课程和学前教育课程。在老年前期课程中,我们可能会面临这种培训的成本。因此,成本只对社会前环境有意义。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的东西,但是成本的关系是与RangeCourseClass的关系,因为QuantitativeCourseClass对特定的环境没有意义。
关于liskov的问题是关于如何使我的团队在这个模型中进行一些修改。
发布于 2012-03-17 00:40:27
我认为你混淆了LSP (Liskov替换原则)的方向: LSP是(强)行为子类型,而不是强行为超类型。因此,LSP并不是针对您的示例,而是针对您的示例:
这个模型是不是违反了利斯科夫原则?我认为是因为与class3的这种关系,所以我们必须弄清楚如何在没有这种关系的情况下建模,或者将这种关系移动到基础上。如果我有一部分处理class2的程序来处理与Class3的关系,我就不能在没有强制转换为Class2的情况下使用基类。
您的模型没有破坏LSP。如果你有一部分程序使用了一些专门处理Class2的变量var (即基础中没有的部分),那么你需要将var声明为Class2。因此,没有必要进行向下转换。并且LSP保证var也表现为Base,所以也不需要显式的上转换。
发布于 2012-03-16 23:33:25
如果class3与基础无关,那么它就不应该在基础中。你不能“破坏”LSP,因为编译器会强制执行它。向下转换不是首选的东西,但这样做并不会破坏LSP。
继承的目的是建立一种“是一种”的关系。猫是一种动物。丰田是-一辆车。
你所说的是将丰田的标志移到汽车级别,只是因为你想让事情变得更容易。这根本不是一个好的设计。
简而言之,将对象移动到基类比向下转换到特定类的设计更糟糕。
发布于 2012-05-10 15:48:27
据我所知,如果不了解问题的各个方面(例如几何),就不能查看问题。所以,我不能理解你的架构的含义。例如,著名的LSP冲突示例: Square:Rectangle -it,当它站在"side“中时,看起来很好。但是,当你开始使用一些函数时,你就会发现问题所在。
https://stackoverflow.com/questions/9739509
复制相似问题