delphi - 抽象方法的默认实现

标签 delphi oop abstract-methods

我正在处理一个大型代码库,它有很多类和这些类的很多抽象方法。我很想知道人们对我在以下情况下应该做什么的看法。

如果我有一个带有抽象方法的类 Parent-A。只会有2个 child 。如果 Child-B 实现了 AbstractMethodA 但 Child-B 没有实现,因为它不适用。

我应该

  1. 从 parent 中删除 abstract 关键字并使用 virtual 或 dynamic?
  2. 提供该方法的空实现。
  3. 提供一个在调用时引发错误的实现。
  4. 忽略警告。

编辑:感谢您的所有回答。它证实了我的怀疑,这不应该发生。进一步调查后发现根本没有使用这些方法,因此我已将它们完全删除。

最佳答案

如果 AbstractMethodA 不适用于 Child-B,则 Child-B 不应继承自 Parent-A。

或者相反,如果 Child-B 继承自 Parent-A,而 AbstractMethodA 不适用于子级,那么它也不应该在父级中。

通过在 Parent-A 中放置一个方法,您是说该方法适用于 Parent-A 及其所有子级。这就是继承的意思,如果你用它来表示不同的意思,你最终会与你的编译器发生严重的争执。

[编辑 - 也就是说,如果该方法确实适用,Mladen Prajdic 的回答很好,但对于所涉及的一个或多个类不应执行任何操作。什么都不做的方法在我看来与不适用的方法不同,但也许我们所说的“不适用”并不是同一回事]

另一种技术是无论如何都要在 Child-B 中实现该方法,但是让它做一些极端的事情,比如总是返回失败,或者抛出异常,等等。它有效,但应该被视为有点麻烦而不是干净的设计,因为这意味着调用者需要知道他们拥有的被他们视为 Parent-A 的东西是真的一个 child B,因此他们不应该调用 AbstractMethodA。基本上你已经放弃了多态性,这是 OO 继承的主要好处。就我个人而言,我更喜欢这样做而不是在基类中有一个抛出异常的实现,因为这样子类就不会因为“忘记”实现该方法而“意外”地表现得很糟糕。它必须实现它,如果它实现它不起作用,那么它会明确地这样做。糟糕的情况应该是嘈杂的。

关于delphi - 抽象方法的默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325692/

相关文章:

delphi - 使用 Delphi 处理大图像并保存为 .jpeg

c# - 一个无法访问的类。 VS2010

java - 有没有办法制作一个非抽象但必须被覆盖的方法?

python - TypeError : Can't instantiate abstract class <. ..> 使用抽象方法

C++ 到 Delphi - 结构和指针加法

windows - URI 方案启动

python - 用于字典转换的特殊方法名称的内置函数

c# - 如何在 C# 中将属性作为参数传递?

java - 如何在抽象方法中使用泛型 EnumMap 作为参数

delphi - 回复 Indy 10 中的地址?