首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >面向对象设计建模

面向对象设计建模
EN

Stack Overflow用户
提问于 2012-03-16 22:52:28
回答 3查看 97关注 0票数 0

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

示例:

代码语言:javascript
复制
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可以有范围日期或定量日期。

今天我有了这个模型:

代码语言:javascript
复制
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的问题是关于如何使我的团队在这个模型中进行一些修改。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-17 00:40:27

我认为你混淆了LSP (Liskov替换原则)的方向: LSP是(强)行为子类型,而不是强行为超类型。因此,LSP并不是针对您的示例,而是针对您的示例:

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

您的模型没有破坏LSP。如果你有一部分程序使用了一些专门处理Class2的变量var (即基础中没有的部分),那么你需要将var声明为Class2。因此,没有必要进行向下转换。并且LSP保证var也表现为Base,所以也不需要显式的上转换。

票数 0
EN

Stack Overflow用户

发布于 2012-03-16 23:33:25

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

继承的目的是建立一种“是一种”的关系。猫是一种动物。丰田是-一辆车。

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-05-10 15:48:27

据我所知,如果不了解问题的各个方面(例如几何),就不能查看问题。所以,我不能理解你的架构的含义。例如,著名的LSP冲突示例: Square:Rectangle -it,当它站在"side“中时,看起来很好。但是,当你开始使用一些函数时,你就会发现问题所在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9739509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档