Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance 在不同的子类中引入相同的属性_Inheritance_Polymorphism - Fatal编程技术网

Inheritance 在不同的子类中引入相同的属性

Inheritance 在不同的子类中引入相同的属性,inheritance,polymorphism,Inheritance,Polymorphism,我使用的是Delphi,但我故意不希望您使用特定的语言,因为这是一个基本问题 我的应用程序现在包含了各种类型的数据记录列表。每个记录都有一组不同的属性。此时,所有记录都由同一通用类的对象在RAM中表示。其中有一个表示记录类型的字段,getter/setter根据该字段内容锁定和解锁数据的检索或更改 我计划开发一个使用多态性的严格体系结构,其中每个记录类型将由相应的子类表示。父类将不包含任何特定于子体的属性,而只包含公共属性 现在,问题是: 某些可用属性存在于多个子类中,但不应出现在基类中。他们的

我使用的是Delphi,但我故意不希望您使用特定的语言,因为这是一个基本问题

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

我计划开发一个使用多态性的严格体系结构,其中每个记录类型将由相应的子类表示。父类将不包含任何特定于子体的属性,而只包含公共属性

现在,问题是:

某些可用属性存在于多个子类中,但不应出现在基类中。他们的接球手和二传手是一样的。如何不重复我自己,为每个属性编写一个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。它们看起来像变量,但实际上调用方法。非常感谢。