各种后代类

时间:2016-09-16 16:25:56

标签: inheritance polymorphism

我正在使用Delphi,但故意不要让你坚持使用特定的语言,因为问题是一个基本问题。

我的应用程序现在包含各种类型的数据记录列表。每条记录都有一组不同的属性。此时,所有记录都由相同通用类的对象在RAM中表示。其中有一个字段表示记录类型,getters / setters根据此字段内容锁定和解锁检索或更改数据。

我计划开发一个具有多态性用法的严格架构,其中每个记录类型将由相应的后代类表示。父类不包含任何特定于后代的属性,但仅包含常见属性。

现在,问题是:

某些可用属性存在于多个后代类中,但不应出现在基类中。他们的吸气剂和制定者是完全相同的。如何不重复自己并为每个属性写一个吸气剂和一个吸气剂?

我想到的唯一想法是将基类中的所有属性实现为受保护,然后将它们移动到后代类中的公共部分。

你认为这个解决方案好还是坏?为什么呢?

还有其他方法可以实现这个目标吗?

插图:

class Base
   prop A
   prop B

class Desc1:Base
   prop C
   prop D

class Desc2:Base
   prop D
   prop E

class Desc3:Base
   prop C
   prop E

2 个答案:

答案 0 :(得分:2)

首先,我不知道德尔福,但你声称我们不应该考虑它。在纯OOP下,您将创建一个具有共享属性的超类,但前提是子类之间具有逻辑链接。例如。狗和猫都是动物,动物可以拥有属性hasTail,由狗,猫和通常动物共享。但是,尽管还具有hasTail属性,Plane不会扩展Animal。

然而,纯OOP并不总是实用的(例如,如果以深度为200的继承树结束)。我建议,除非有一大组共享属性,更好的是,将它们组合在一个超类中是有意义的。你只需咬紧牙关并输入额外的存取器。

如果存在大量共享属性,但类不应该扩展同一个类(因为Cat和Plane),则可以查看接口。接口定义了您要公开的行为,该行为由许多不应按超类分组的类共享(Cat和Plane也可以在接口PublicTransport上具有Turn,Forward,SlowDown,AcceptPassengers等)。它不会节省你打字,但它是“正确的方式”。

检查Delphi是否有一个IDE,允许您生成所有这些访问器,而无需单击几下。 Java确实如此。在这种情况下,您将拥有每个类的文件,现在称为“beans”,只有属性和自动生成的访问器。如果可能的话,你可以在其他地方获得更多动手逻辑。这样,只有在需要添加/删除属性时才能编辑bean。

如果没有,并且共享属性的数量很多,请随意做你想做的事,但留下很多评论,因为无论谁维护它(包括将来你)都会遇到麻烦。

您可以拥有一个属性“properties”,其地图为“propertyname” - >“value”。并在构造函数上定义属性列表,在基类上只有一个通用的getter和setter。但是,如果您不希望语言处理您的检查,并希望对您希望拥有的属性保持开放态度。

答案 1 :(得分:1)

你的想法并不好,因为通过使一些属性受到保护,你强制它们被包含在所有子类中,这显然是不正确的。此外,如果增加了许多子类,您必须在基类中包含越来越多的属性。

你可以做的是引入允许多重继承或混合的抽象:

  • (抽象)C ++课程
  • Java接口
  • Scala中的特质

将包含其中一个属性CDE。 例如:

interface CHolder
    prop C

interface DHolder
    prop D

interface EHolder
    prop E

现在你可以让DescN扩展所需的抽象:

class Base
   prop A
   prop B

class Desc1:Base, CHolder, DHolder

class Desc2:Base, DHolder, EHolder

class Desc3:Base, CHolder, EHolder