代码之家  ›  专栏  ›  技术社区  ›  GoClimbColorado

配置类(dis)继承的正确OOP方法是什么?

oop
  •  0
  • GoClimbColorado  · 技术社区  · 14 年前

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

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

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

    如果我想要下面这样的东西,我的小部件类是否会从保存所有小部件的数据库表类继承?如果是这样,那么我如何“隐藏”或取消特定小部件类型之间的属性继承?

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

    谢谢你的建议。

    3 回复  |  直到 14 年前
        1
  •  0
  •   samitgaur    14 年前

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

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

    这将涵盖数据部分。然后,如果您觉得这三个小部件类之间有一些共性,您还可以创建一个基类,这三个类可以扩展并在其中添加任何公共方法或字段。

        2
  •  2
  •   Mongus Pong    14 年前

    遗产被高估了!

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

    它只是把这些课程结合在一起,从长远来看只会造成痛苦。

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

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

    Prefer composition to inheritance.

        3
  •  0
  •   Hugh Brackett    14 年前

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