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

时间:2010-07-08 14:33:44

标签: oop

我似乎无法正确地谷歌这个...我有一个类(Widget)代表数据层中的数据库表。

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

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

如果我想要类似下面的内容,我的Widget类是否会从包含所有小部件的数据库表类继承?如果确实如此,那么我将如何“隐藏”或删除特定小部件类型之间的属性?

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

感谢您的建议。

3 个答案:

答案 0 :(得分:2)

继承被高估了!

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

它只是将各种课程结合在一起,从长远来看只会造成痛苦。

您可以使表类成为每个窗口小部件类的成员。然后每个小部件可以只显示必要的字段。

然后,您可以获得额外的好处,如果您需要更改其中一个小部件以使用不同的表,您只需要在其中一个小部件中更改一小部分代码。

请参阅Prefer composition to inheritance.

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

这将涵盖数据部分。然后,如果您觉得三个窗口小部件类之间存在某些共性,您还可以创建一个基类,三者可以扩展并在那里添加任何常用方法或字段。