使用“兄弟”类类型的 Delphi 多态性

Ron*_*ter 1 delphi polymorphism

我们有一个应用程序可以相当广泛地使用 TIniFile。过去我们创建了自己的后代类,我们称之为 TMyIniFile,它覆盖了 WriteString。我们创建了一个整个应用程序都使用的实例。该实例通过属性和参数四处传递,但所有这些的类型仍然是 TIniFile,因为它是原始的。这似乎有效,通过多态调用我们覆盖的方法,即使所有变量类型仍然是 TIniFile。这似乎是正确的,因为我们来自 TIniFile。

现在我们正在进行一些更改,我们希望将 TMyIniFile 切换为从 TMemIniFile 而不是 TIniFile 的后代。它们都是 TCustomIniFile 的后代。我们也可能会覆盖更多的方法。我倾向于将所有声明保留为 TIniFile,即使从技术上讲我们的类不再是它的后代,只是为了避免在不需要时更改大量源文件。

在多态的每个教程示例中,变量都被声明为基类,并创建后代类的实例并将其分配给基类的变量。所以我认为这是做到这一点的“正确”方式。我现在正在做的事情最终会将变量声明为,我猜你会称之为“兄弟”类,所以这“似乎是错误的”。这是一件坏事吗?我是在自找麻烦,还是多态性实际上允许这种事情?

Rem*_*eau 6

TIniFileTMemIniFile是不同的类,彼此不派生,因此您根本无法创建TMemIniFile对象并将其分配给TIniFile变量,反之亦然。编译器不会让你这样做。使用类型转换来强制它会很危险。

您只需要更新其余代码即可将所有TIniFile声明TCustomIniFile改为,这是两个类的共同祖先。这才是“正确”的做法。

  • @DavidHeffernan 我持相反意见。所有的变量都应该是 TCustomIniFile,因为这是 WriteString() 首先暴露的地方,代码不需要知道 WriteString() 是如何实现的细节。如果以后代码需要再次更改实现,如果所有变量都是基类而不是具体的派生类,这样做会更容易。它还允许在更灵活的时间范围内将代码从一个具体类迁移到另一个类。 (3认同)