警惕菱形关系:多重类继承的隐患
7378 为本文评分:
3.0
警惕菱形关系:多重类继承的隐患
匿名作者 2016年8月4日,星期四
在开发面向对象的IDL程序时,一个常用的类是IDL_Object。这个便捷的超类用于为其继承的子类提供IDL的_overload功能。然而,当多个类继承IDL_Object时,如果您尝试编写一个继承多个同样继承自IDL_Object的超类的类,您可能会遇到问题。
以下是一些说明该问题的类定义例程:
**pro Superclass_A__define
!null = {Superclass_A, $
继承 IDL_Object**}
end
pro Superclass_B__define
!null = {Superclass_B, $
继承 IDL_Object}
end
pro Subclass_S__Define
!null = {Subclass_S, $
继承 Superclass_A, $
继承 Superclass_B}
end
这可以被称为菱形关系,因为它在类图中形成了一个菱形。

遗憾的是,尝试运行此代码会导致错误。
% 冲突或重复的结构标签定义:IDL_OBJECT_TOP。
% 执行在:SUBCLASS_A__DEFINE 处中止。
由于编写代码的方式不止一种,有几种替代方法可以避免菱形关系导致的不良行为。
仅继承基础层类(水平关系)
如果您想避免继承类时的混淆,可以将类结构设计为仅继承基类,即不继承任何其他类的类。在此模型中,Superclass_A和Superclass_B将是基类。您不会直接实例化或调用它们的方法,而是编写新的类Class_A和Class_B,它们将同时继承基类和IDL_Object(也是一个基类)。这些新的子类将是您实际交互的对象。

现在,Subclass_S将简单地继承两个基类以及IDL_Object。

使用线性继承结构(垂直关系)
另一种选择是使用完全线性的继承结构。这意味着每个类只继承一个超类。

这种结构简单,在避免超类冲突方面非常安全。缺点是,当您定义Superclass_B继承Superclass_A时,您就是在声明B可以被识别为A。换句话说,Obj_Isa(B, 'Superclass_A') 将返回 true。您可能不一定希望将两者关联起来,在这种情况下,这将不是定义类的合适方式。
其他菱形关系
除了IDL_Object,菱形关系在许多其他情况下也可能引发问题。例如,当位于菱形顶部的超类包含一个状态或成员变量时,中间类在尝试访问或修改这个单一超类时可能会出现冲突。总的来说,这是一个您希望避免的关系。
这两种并不是唯一的解决方案,只是关于如何构建避免冲突的类关系的几点建议。如果其他方法都失败了,那就画一个类图。毕竟,一张图胜过千行代码,对吧?