【问题标题】:What is the proper OOP way to configure class (dis)inheritance?配置类(dis)继承的正确 OOP 方法是什么?
【发布时间】:2010-07-08 14:33:43
【问题描述】:

我似乎无法正确地用谷歌搜索这个...我有一个类(小部件),它表示来自数据层的数据库表。

该表包含 3 种不同类型的记录,其中一种仅使用 5 列,另一种使用 10 列等。每条记录都有一组不同的验证和业务规则,我想通过业务层抽象来控制这些规则。

创建 3 个具体类并将属性映射到单个数据库表类是否正确?我觉得我错过了使用接口或继承的机会?

如果我想要类似下面的东西,我的 Widget 类不会继承自包含所有小部件的数据库表类吗?如果确实如此,那么我将如何“隐藏”或取消继承特定小部件类型之间的属性?

List<SmallWidget> sw = BusinessLayer.GetWidgets<SmallWidget>();
List<MediumWidget> mw = BusinessLayer.GetWidgets<MediumWidget>();
List<LargeWidget> lw = BusinessLayer.GetWidgets<LargeWidget>(); 

感谢您的建议。

【问题讨论】:

    标签: oop


    【解决方案1】:

    继承被高估了!

    如果您认为没有理由使用继承(即没有共享代码),请不要使用它。

    它只会将类耦合在一起,从长远来看只会造成痛苦。

    您可以使表格类成为每个小部件类的成员。然后每个小部件可以只公开必​​要的字段。

    然后,您将获得一个额外的优势,即如果您需要更改其中一个小部件以使用不同的表格,您只需更改其中一个小部件中的一小部分代码。

    Prefer composition to inheritance.

    【讨论】:

    • "您可以让表格类成为每个小部件类的成员。"当然,在不支持多重继承的语言中,您必须使用接口模式(或者,如果是 C++,我相信模板?)。
    • 他不是在谈论多重继承。他说的是Widget 有一个 WidgetTable
    【解决方案2】:

    让您的业务对象尽可能接近实际业务实体 - 为三种类型的小部件创建三个单独的类 - SmallWidget、MediumWidget 和 LargeWidget。让有一个数据类 - 映射到表的 WidgetData。然后,您可以使用以下任何一种策略来实现这三个小部件类:

    • 将相关字段添加到三个类中的每一个。还要添加一个构造函数,该构造函数采用 WidgetData 类型的对象。构造函数可以使用 WidgetData 对象的字段来初始化字段。
    • 只为每个 WidgetData 类型的类添加一个字段。仅为相关字段添加 getter 到三个类,这些字段将 get 调用委托给 WidgetData 对象以检索所需字段的值。此策略将避免在 WidgetData 和三个小部件类之间重复字段值,并且可能会节省一些内存。

    这将涵盖数据部分。那么如果你觉得这三个小部件类之间有一些共同点,你也可以创建一个基类,三个可以扩展并在其中添加任何常见的方法或字段。

    【讨论】:

    • 做一些家务,这是一年后最好的答案。对不起萨米特。
    • 没问题。很高兴它很有用。
    【解决方案3】:

    如果业务规则不重叠,只需忽略它们在同一个表中的事实(可能使用视图)并创建三个类。如果有通用规则,请为它们创建一个基类并从中继承。基类将包含所有列,但只公开常见的列。在适当的后代中公开其他列。

    【讨论】:

      猜你喜欢
      • 2016-11-21
      • 2010-10-17
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多