![]() |
1
11
正如Delphi帮助中所记录的,类帮助器不是为一般用途而设计的,因此它们被错误地认为有许多限制,甚至是错误。 然而,有一种看法——在我看来是不正确和危险的——认为这些是通用“工具箱”中的合法工具。我写过博客 why this is wrong 然后你就可以通过 following a socially responsible coding pattern (尽管这不是防弹的)。 如果没有 任何 这些错误或限制或(最重要的是) 风险 通过对从您试图扩展的类派生的“伪”类使用硬类型转换。而不是:
使用
就像一个“正式”的助手一样,你永远不会例示这个 拖鞋 类,您只使用它来改变 TFO 类,除非您必须是显式的。在您的代码中,当您需要使用 TFO 使用你的“助手”方法,你必须硬铸:
缺点:
优势:
它不像一个课堂助手那样“干净”,但在这种情况下,“干净”的方法实际上只是把地毯下的烂摊子扫干净,如果有人扰乱了地毯,你最终会得到一个比你开始时更大的烂摊子。 |
![]() |
2
12
我现在仍然使用Delphi2009,所以我想我可以添加一些其他方法来扩展一个通用类。在较新版本的Delphi中,这些应用程序应该同样适用。让我们看看添加
拦截器 班拦截器类是与继承的类同名的类:
注意您需要使用完全限定名,
这种技术的优点是您的扩展大部分是透明的。可以在使用原始TList的任何位置使用新TList的实例。 这种技术有两个缺点:
谨慎的单元命名和避免在与拦截器类相同的位置使用“原始”类可以减轻这种混淆。密封类在Embarcadero提供的RTL/VCL类中不是什么问题。我在整个源代码树中只找到了两个密封的类:tgChandleList(只在现在已经失效的delphi.net中使用)和tcharacter。不过,您可能会遇到第三方库的问题。 这个 装饰者 模式decorator模式允许您通过用继承其公共接口的另一个类包装类来动态扩展类:
又一次出现了利弊。 优势
缺点
边注 所以,如果你想让一个类几乎不可能扩展,那就让它成为一个密封的泛型类。这样,类助手就不能触摸它,也不能从中继承它。剩下的唯一选择就是包装它。 |
![]() |
3
7
据我所知,没有办法将类助手放在通用类上并让它编译。你应该把这作为一个错误向质量控制报告。 |
![]() |
Glory Raj · 有什么方法可以使这两个块具有共同的功能吗 2 年前 |
![]() |
milczi · Swift通用无强制展开向下投射 6 年前 |
![]() |
bugs · Typescript-泛型类型扩展自身 6 年前 |
![]() |
John Bustos · C#通用工厂模式,不说明通用工厂模式的类型 6 年前 |
![]() |
Blankdud · 具有默认数据的通用对象创建方法 6 年前 |
![]() |
Tim Hutchison · 从泛型对象列表中读取泛型值 6 年前 |