Inheritance 在不同的子类中引入相同的属性
我使用的是Delphi,但我故意不希望您使用特定的语言,因为这是一个基本问题 我的应用程序现在包含了各种类型的数据记录列表。每个记录都有一组不同的属性。此时,所有记录都由同一通用类的对象在RAM中表示。其中有一个表示记录类型的字段,getter/setter根据该字段内容锁定和解锁数据的检索或更改 我计划开发一个使用多态性的严格体系结构,其中每个记录类型将由相应的子类表示。父类将不包含任何特定于子体的属性,而只包含公共属性 现在,问题是: 某些可用属性存在于多个子类中,但不应出现在基类中。他们的接球手和二传手是一样的。如何不重复我自己,为每个属性编写一个getter和一个setter 我想到的唯一想法是将基类中的所有属性实现为受保护的,然后将它们移动到子类中的公共部分 你认为这个解决方案是好是坏?为什么? 有没有其他方法可以达到这个目标 说明:Inheritance 在不同的子类中引入相同的属性,inheritance,polymorphism,Inheritance,Polymorphism,我使用的是Delphi,但我故意不希望您使用特定的语言,因为这是一个基本问题 我的应用程序现在包含了各种类型的数据记录列表。每个记录都有一组不同的属性。此时,所有记录都由同一通用类的对象在RAM中表示。其中有一个表示记录类型的字段,getter/setter根据该字段内容锁定和解锁数据的检索或更改 我计划开发一个使用多态性的严格体系结构,其中每个记录类型将由相应的子类表示。父类将不包含任何特定于子体的属性,而只包含公共属性 现在,问题是: 某些可用属性存在于多个子类中,但不应出现在基类中。他们的
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
首先,我不知道德尔菲,但你说我们不应该把它考虑进去。在纯OOP下,您将创建一个具有共享属性的超类,但前提是子类之间具有逻辑链接。狗和猫都是动物,动物可以拥有狗、猫和通常的动物共有的hasTail属性。然而,飞机将不会延伸动物,尽管也有hasTail属性 然而,纯OOP并不总是实用的(例如,如果以深度为200的继承树结尾)。我建议,除非有大量的共享属性,或者更好的是,将它们分组到一个超类中是有意义的。你只要咬紧牙关,输入额外的访问者 如果存在大量共享属性组,但这些类不应扩展同一个类(因为Cat和Plane),则可以查看接口。接口定义了要公开的行为,这些行为由许多不应按超类分组的类共享(同样,在接口PublicTransport上,Cat和Plane可能有转向、前进、减速、接受乘客等)。这不会节省你打字的时间,但这是“正确的方式” 检查Delphi是否有一个IDE,它允许您生成所有这些访问器,而无需单击几下。Java有。在这种情况下,每个类都有一个文件,现在称为“bean”,它只具有属性和自动生成的访问器。如果可能的话,你在其他地方有更多的实际操作逻辑。这样,您只在需要添加/删除属性时编辑bean 如果没有,而且共享属性的数量很大,请随意做你想做的事情,但留下很多评论,因为无论是谁(包括未来的你)都会有麻烦
您可以有一个属性“properties”,其映射为“propertyname”->“value”。并在构造函数上定义属性列表,基类上只有一个泛型getter和setter。但是,如果您不想让语言为您处理检查,并且希望对您想要的属性开放。您的想法并不好,因为通过保护某些属性,您强制将它们包含到所有子类中,这显然是不正确的。此外,如果大量子类增长,则必须在基类中包含越来越多的属性 您可以做的是引入允许多重继承或混合的抽象:
- (摘要)C语言中的类++
- Java中的接口
- Scala性状
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
你所说的财产到底是什么意思?函数、过程、变量?他很可能是指类中的成员,例如id@cedric.salaun:在许多编程语言(如Delphi或C)中,有一种特殊的类成员名为properties。它们看起来像变量,但实际上调用方法。非常感谢。