【发布时间】:2017-08-13 15:05:53
【问题描述】:
在这位退休的硬件工程师学习 Matlab 面向对象编程时,请温柔对待他。
我对具有一系列特殊功能的二叉树类有多种需求,用于遍历、修剪、添加、重新连接简单的二叉树。我用大约 20 种方法编写了我自己的类(classdef btree3
接下来,我为继承二叉树(classdef EqTree
X3 = EqTree;
X3.GenerateRandomTree(50,8);
X3.RenumberTree(100);
disp('Walking X3 tree');
X3.WalkTree;
我遇到的问题是,当 X3 中有 EqTree 数据属性时,树中更靠下的节点都没有它们。所有较低的节点都被分配为 btree3 对象,因为(我假设)默认情况下所有 btree3 方法都知道如何做,即使它是为 EqTree 对象调用的。此处显示的是每个对象在完成后的样子:
>> Z1=btree3
Z1 =
btree3 with properties:
NodeNum: []
Prev: [0×0 btree3]
Left: [0×0 btree3]
Right: [0×0 btree3]
>> Z2=EqTree
Z2 =
EqTree with properties:
Operator: []
LeafData: []
NodeEq: []
NodeEqName: []
OutputType: []
NodeNum: []
Prev: [0×0 btree3]
Left: [0×0 btree3]
Right: [0×0 btree3]
>>
我的问题:有没有办法告诉 btree3 中的继承方法分配树的节点也分配派生类的数据属性?例如,在上面调用中创建的随机树中,我看到了:
X3 =
具有属性的EqTree:
Operator: []
LeafData: []
NodeEq: []
NodeEqName: []
OutputType: []
NodeNum: 100
Prev: [0×0 btree3]
Left: [1×1 btree3]
Right: [1×1 btree3]
X3.左
ans =
具有属性的btree3:
NodeNum: 101
Prev: [1×1 EqTree]
Left: [0×0 btree3]
Right: [0×0 btree3]
这里有两个问题:
1) EqTree 日期没有在树中向下分配,并且
2) 指针不再是同质的,从 btree3 继承的方法在向上遍历树并在根处找到 EqTree 对象时失败。
如果需要,我可以将树分配为 btree3 对象,然后使用 EqTree 数据填充数据(如果 EqTree 类独立)。
我希望问题足够清楚,但如有必要可以发布更多代码。
谢谢!
Re:EqTree 构造函数:EqTree 被分配,如果提供,则设置 btree3 中的 NodeNum 字段:
classdef EqTree < btree3
properties(SetAccess = private)
Operator % Logic, math or function
LeafData % Timetable or fixed values
NodeEq % Equation node represents
NodeEqName % Name that is used in higher equations
OutputType % Float, Integer, timetable, boolean, etc.
end
methods
function ThisNode = EqTree(NodeNum)
if (nargin > 0)
ThisNode.NodeNum = NodeNum;
end
end
Re:btree3类添加节点的方法:
为了更加清楚,上面使用的 btree3 方法 GenerateRandomTree 调用 btree3 中的其他方法来实际为树分配新成员。当添加到树的左侧时,btree3 调用 AddNodeLeft 方法,作为 btree3 类的一部分,该方法只知道分配一个新的 btree3 对象。当由 EqTree 类继承和调用时,所有这些都有效,但新对象是 btree3 对象,而不是 EqTree 对象。我希望了解如何在这里分配派生类对象:
function AddNodeLeft(ThisNode, newNodeNum)
% Add newNode on left after ThisNode.
if ThisNode.Left.exists
error('addNodeLeft: Left side in use')
end
newNode = btree3(newNodeNum);
newNode.Prev = ThisNode;
ThisNode.Left = newNode;
end
【问题讨论】:
-
我猜你还没有为 EqTree 类实现一个新的构造方法?有的话可以发一下吗?
-
嗯,我打算这样做,但也许它没有正确完成?我似乎无法在此评论中发布代码,因此我将其添加到原始帖子中。
-
我确实注意到,虽然 Z1=EqTree 有效,但 Z2=EqTree(100) 并没有像它告诉我的那样,我不能设置 EqTree 的只读属性 'NodeNum,所以 btree3 对象是已分配,但我可能需要一种设置 NodeNum 的方法。
标签: matlab class oop inheritance