- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我正在为我的项目测试 FlowJS,我遇到了 Type Aliases 的问题. 我为 API 构建了一个 Web SDK:我有一个使用此方法的 Helper 类: class Helper {
我是 Dart 的新手,仍在学习它带来的所有细微差别。我当前的任务真正困扰的一件事是从父类继承(或代理)静态方法。 void main() { EnglishCasual.greet(); } c
我正在尝试巩固 Go 提供的继承概念(也许是“组合”而不是纯粹的继承)。但是,我无法理解为什么我不能将“父”类型用作 func 参数来生成作用于该参数的通用函数。 package main impor
我在准确表述它时遇到问题,所以我在标题中留下了更笼统的描述(如果您对问题有更准确的描述,请发表评论,我会编辑标题)。 问题: AudioStream 和VideoStream 两个类派生自基类Medi
我的应用程序不仅具有“用户”,而且还具有“管理员”和“ super 管理员”。由于所有这三个共享相同的属性,因此我只想使用一个带有附加属性“role”的表,该属性可以是“user”,“admin”或“
我正在使用数据库优先方法和 DbContext。我的数据模型中有几个继承结构 (TPH)。但是 DbContext 只为基类创建一个 DbSet,而没有为子类创建一个 DbSet。我应该如何检索指定子
我正在使用数据库优先方法和 DbContext。我的数据模型中有几个继承结构 (TPH)。但是 DbContext 只为基类创建一个 DbSet,而没有为子类创建一个 DbSet。我应该如何检索指定子
我有一个生成很多子对象的应用程序,每个子对象都与一些全局应用程序对象一起工作,例如在全局应用程序注册表中注册自己,更新应用程序统计信息等。 应用程序应该如何将访问这些全局对象的能力传递给 child
我有 2 个结构,其中一个继承了由 type Common struct {...} 表示的所有结构中共有的值 type Common struct{ Id int CreatedAt
我的代码: Ext.onReady(function() { // Every property is declared inside the class Ext.define('MyCustomPa
我有一个包含多个类的应用程序,这些类继承/是第三方库类的子类。例如,来自 Qt Framework 的 QDialog。 我应该在应用程序的 UML 类图中指定继承关系吗? 是否期望(或标准)表示此类
我遇到了这个问题,因为我认为我对 Backbone 的理解不正确。 我有一个名为 Runnable 的父类(super class)和一组继承自它的子类: var Runnable = Backbon
考虑以下 HTML: foo bar 和 CSS: a { text-decoration:none; border-bottom-width: 0px; border-bot
我想做个模板Class BaseDialog ,但在进行最终对话时 MyDialog1 , 继承了 BaseDialog , 我收到错误,然后无法在设计模式下显示对话框。 以下是我得到的错误列表。 a
我对 android 文档中的这两个术语感到困惑!! these screenshot about what i mean 最佳答案 常量是用 static 和 final 修饰符声明的字段。继承常量
我最近遇到了一个新的警告: 继承构造函数不继承省略号 我正在尝试管道 Object{42}; // ... into an init that handles integers ...和... Obj
我正在使用 TypeScript 开发 Aurelia 应用程序。在此应用程序中,我定义了一组自定义元素,每个元素共享一组可绑定(bind)属性,这些属性被转换为 css 设置,如以下简化示例所示:
我想知道为什么人们会说: “继承类不继承构造函数”。 如果你可以使用父类的构造函数,无参构造函数无论如何都会被自动调用。 例子: #include using namespace std; clas
我刚刚开始探索 Kotlin 语言。我正在为继承、var&val 和副作用而苦苦挣扎。 如果我用 val x 声明一个特征 A 并在 AImpl 中覆盖 x ,则可以将其覆盖为 var(参见下面的代码
我正面临一个编码/解码问题,涉及使用 MOXy 的 JAXB 实现和外部元数据绑定(bind)文件的继承和多态性。 我无法控制 XML 文件或模型类。 模型内部有多个类继承其他 DTO 类。 这是我正
我是一名优秀的程序员,十分优秀!