【发布时间】:2019-11-23 12:23:57
【问题描述】:
据我所知,继承层次结构的基类型,限制了通用字段和方法,这些字段和方法将是必不可少的,以便将派生类视为与基类型相同的类型。 (如果我错了,请纠正我)。
所以问题是,既然基类型包含子类型的泛化,我们不应该将所有基类都视为抽象吗?因为它们只描述了一个类型应该如何表现以及它应该包含哪些基本元素才能被指定类型考虑,这难道不是抽象的真正本质吗?
如果我的主张是正确的,那么为什么 OOP 语言没有将继承链中的基类作为抽象来强制减速?为什么它们允许我们从非抽象类型继承?
【问题讨论】:
-
你的前提是错误的。基类本身可以是全功能类,对此类进行子类化以更改某些特定行为仍然是有意义的。
-
但是先生,既然您是从另一个类继承它,您不认为这一定意味着您是从一个抽象实体继承的吗,我知道环境建模会损害抽象级别,但是你不认为既然它是一个被认为是基本类型的实体,它应该成为一个抽象吗?
-
没有。想想 UI 控件、小部件。您通常有非抽象基类,它承载所有常见 UI 小部件行为的完整实现。对于这样一个承载了这么多实现细节的基类来说,抽象是没有意义的。如果您从小部件作为抽象类开始,您很可能会在其之上添加一个基类,所有小部件都将从该基类继承。
-
假设您有这个抽象基类,您从中派生了非抽象的子类,它可以被实例化等等。它已经使用了 5 年,但现在我们决定我们需要与您的子类相同的第二个版本,但对于看不清楚的人,它的输出格式不同。解决方案当然是继承您的子类并覆盖
print方法。您的子类是否因为我们继承自它而突然成为一个不完整的抽象类?当然不是!如果基类在某种意义上是完整的,那么它们就是非抽象的。 -
@RonaldAaronson 我认为解决方案不是子类化子类,而是使用组合并通过依赖注入提供打印方法行为,因为需要使用水平重用(即:不是所有子类-classes 使用基本的默认功能)。我认为从子类派生不是保持代码干净的最佳选择,但要使用策略模式,并在单独的类中提供必要的行为,这些类从描述行为的公共接口驱动,我认为将在基类对所有派生类型都是通用的。
标签: oop inheritance abstraction