gpt4 book ai didi

inheritance - 在不同的后代类中引入相同的属性

转载 作者:行者123 更新时间:2023-12-04 02:51:04 24 4
gpt4 key购买 nike

我正在使用 Delphi,但故意不希望您坚持使用特定语言,因为问题是一个基本问题。

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

我计划开发一个使用多态性的严格架构,其中每个记录类型将由相应的后代类表示。父类将不包含任何特定于后代的属性,而仅包含公共(public)属性。

现在,问题:

一些可用属性存在于多个子类中,但不应出现在基类中。它们的 getter 和 setter 是相同的。如何不重复自己并为每个属性编写一个 getter 和一个 setter?

我想到的唯一想法是将基类中的所有属性实现为 protected ,然后将它们移动到子类中的公共(public)部分。

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

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

插图:

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

最佳答案

首先,我不了解 Delphi,但您声称我们不应该考虑它。在纯 OOP 下,您将创建一个具有共享属性的父类(super class),但前提是子类之间具有逻辑链接。例如。 Dog 和 Cat 都是 Animal,Animal 可以拥有 hasTail 属性,该属性由 Dog、Cat 和 Animal 共享。然而,Plane 不会扩展 Animal,尽管它也有 hasTail 属性。

然而,纯 OOP 并不总是实用的(例如,如果您以深度为 200 的继承树结束)。我建议,除非有大量的共享属性,更好的是,将它们分组到一个父类(super class)中是有意义的。您只是硬着头皮输入额外的访问器。

如果有大量共享属性,但类不应该扩展同一个类(因为 Cat 和 Plane),您可以查看接口(interface)。一个接口(interface)定义了您想要公开的行为,这些行为由不应由父类(super class)分组的许多类共享(同样,Cat 和 Plane 可以在接口(interface) PublicTransport 上具有 Turn、Forward、SlowDown、AcceptPassengers 和任何内容)。它不会节省您的打字时间,但这是“正确的方式”。

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

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

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

关于inheritance - 在不同的后代类中引入相同的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com