2012-03-16 66 views
0

如何建立一个域,当你有一个基类和2个类扩展这个基类并且只有一个派生类与另一个对象有关系时。OO设计建模

例子:

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。如果我有一个处理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环境。

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

关于liskov的问题是关于如何促使我的团队在此模型中进行一些修改。

+0

你能提供一个更具体的例子吗?据我所知,你并没有破坏LSP。请注意,您可能正在处理Class3,但它与“Base”没有任何关系。它仍然是一个Base对象加上其他方法。它只是取决于客户端类是否需要“Base”或“Class2”对象 – DPM 2012-03-16 14:59:27

+0

它似乎忘记了extends关键字。另外,我还不确定数量和范围的含义以及它们与成本和“先行性”的关系。你也可以在代码中包含成本。 – DPM 2012-03-16 15:33:03

+0

你的澄清似乎没有帮助,因为你忘了很多事情,说明你的问题。你的对象不会从其他任何东西继承,并且你没有定义什么“presencial”的意思。 – 2012-03-16 16:43:18

回答

0

我认为你混淆了LSP的方向(Liskov Substitution Principle):LSP是(强)行为分类,而不是强行为超级分类。因此,LSP不符合你的例子,但对你的例子:

这个模型打破Liskov原理?我认为是因为这个 与class3的关系,所以我们必须弄清楚如何在没有 这个关系的情况下进行建模,或者将这个关系移动到Base。如果我有 程序的一部分处理Class2来处理与Class3的关系,那么我不能在不转换到class2的情况下使用基类来处理I 。

您的模型不打破LSP。如果您有一部分程序使用了一些特别处理Class2的变量var(即零件不在Base中),您需要将var声明为Class2的。所以不需要沮丧。而且,LSP也保证var的行为与Base一样,因此不需要显式的upcast。

1

如果class3与base没有任何关系,那么它不应该在base中。由于编译器强制执行,因此不能“中断”LSP。向下转换不是首选,但这样做不会中断LSP。

继承的目的是要有一个“是一个”的关系。猫是一种动物。丰田汽车是一辆汽车。

你说的是将丰田标志移动到汽车级,只是因为你想让事情变得更简单。这根本不是好设计。

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

+0

我不想把Class3的真实性移到基类上我知道这是一件坏事。我真正的问题是在“澄清”模式下(对不起,我做了我最好的例证)。成本与RangeCourseClass有关,但我需要处理CourseClass对象,在这种情况下,我需要将instanceof用于RangeCourseClass。那就是问题所在。 – Leo 2012-03-16 15:42:25

0

据我所知,如果不知道问题方面(例如几何),就无法查看问题。所以,我无法理解你的建筑的意义。例如,着名的LSP违例例如: 正方形:矩形 - 当它站在“侧”时,它看起来很好。但是,当你开始使用并且放置了一些功能时,你可以看到问题。