我正在使用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
答案 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
,D
或E
。
例如:
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