|
|
1
11
我目前仍在使用Delphi 2009,因此我想添加一些其他方法来扩展泛型类。这些应该在较新版本的Delphi中同样有效。让我们看看添加一个
拦截器 类拦截器类是与它们继承的类同名的类:
请注意,您需要使用完全限定名,
这种技术的优点是你的扩展大多是透明的。您可以在使用原始TList的任何地方使用新TList的实例。 这种技术有两个缺点:
通过仔细命名单元并避免在拦截器类的同一位置使用“原始”类,可以减轻混淆。在Embarcadero提供的rtl/vcl类中,密封类并不是什么问题。我在整个源代码树中只找到了两个密封的类:TGCHandleList(仅在现已停用的Delphi.NET中使用)和TCharacter。不过,您可能会遇到第三方库的问题。 装饰器 模式装饰器模式允许您通过用继承其公共接口的另一个类包装类来动态扩展类:
这又有优点和缺点。 优势
缺点
边注 所以,如果你想让一个类几乎不可能扩展,那就把它变成一个密封的泛型类。然后类助手不能触摸它,也不能从中继承。剩下的唯一选择就是包装它。 |
|
|
2
12
如Delphi帮助中所述,类帮助程序不是为通用目的而设计的,因此被错误地认为具有许多限制甚至错误。 然而,在我看来,有一种看法是不正确和危险的,即这些是通用“工具包”中的合法工具。我在博客上写过 why this is wrong 随后,您将了解如何通过以下方式减轻危险 following a socially responsible coding pattern 你可以在不使用类助手的情况下实现很多类助手的效果 这些错误或限制(最重要的是) 风险
使用
就像使用“正式”助手一样,你永远不会实例化这个 类,你只用它来改变 TFoo 类,除非在这种情况下你必须明确。在代码中,当你需要使用某个实例时 TFoo 使用你的“助手”方法,你必须硬铸:
缺点:
优势:
它不像课堂助手那样“干净”,但在这种情况下,“更干净”的方法实际上只是把地毯下的烂摊子扫干净,如果有人打扰了地毯,你最终会得到比开始时更大的烂摊子。 |
|
|
3
7
据我所知,没有办法将类助手放在泛型类上并编译它。你应该把这当作bug报告给QC。 |