Matlab 继承-基类函数可以分配派生类数据吗?
当这位退休的硬件工程师学习Matlab面向对象编程时,请对他温和一点 我对一个二叉树类有多种需求,其中包含一系列特殊函数,用于遍历、修剪、添加、重新布线一个简单的二叉树。我已经用大约20个方法编写了我自己的类(classdefbtree3Matlab 继承-基类函数可以分配派生类数据吗?,matlab,class,oop,inheritance,Matlab,Class,Oop,Inheritance,当这位退休的硬件工程师学习Matlab面向对象编程时,请对他温和一点 我对一个二叉树类有多种需求,其中包含一系列特殊函数,用于遍历、修剪、添加、重新布线一个简单的二叉树。我已经用大约20个方法编写了我自己的类(classdefbtree3
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]
NodeNum: 101
Prev: [1×1 EqTree]
Left: [0×0 btree3]
Right: [0×0 btree3]
X3.左
ans=
具有以下属性的btree3:
Operator: []
LeafData: []
NodeEq: []
NodeEqName: []
OutputType: []
NodeNum: 100
Prev: [0×0 btree3]
Left: [1×1 btree3]
Right: [1×1 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
应该有助于指导你,以及这一点。我猜btree3
的构造函数初始化了NodeNum
、Prev
、Left
和Right
。因此,您的EqTree
构造函数应该看起来像这样:
function ThisNode = EqTree(NodeNum)
args = {};
if (nargin > 0)
args = {NodeNum};
end
ThisNode = ThisNode@btree3(args{:});
% Other initializations specific to EqTree objects
end
您可能还需要在此处重新初始化Prev
、Left
和Right
,以便它们是EqTree
对象(即ThisNode.Prev=EqTree.empty;
)
对于创建给定类对象的其他方法,如AddNodeLeft
,您可以遵循中的模式,重写方法以接受给定类的对象,而不是在内部创建对象:
function AddNodeLeft(ThisNode, newNode)
% Add newNode on left after ThisNode.
if ThisNode.Left.exists
error('addNodeLeft: Left side in use')
end
% Probably also want to check that ThisNode and newNode are the same class!
newNode.Prev = ThisNode;
ThisNode.Left = newNode;
end
然后这样称呼它:
ThisNode.AddNodeLeft(EqTree(newNodeNum));
我猜您还没有为EqTree类实现新的构造函数方法?如果你有,你能把它贴出来吗?嗯,我本来打算贴的,但可能没有贴好?我似乎无法在此评论中发布代码,所以我会将其添加到原始帖子中。但我确实注意到,虽然Z1=EqTree有效,但Z2=EqTree(100)却不能,因为它告诉我EqTree的NodeNum“无法设置只读属性”,所以btree3对象已分配,但我可能需要一个设置NodeNum的方法。谢谢。我实际上使用了双链表示例来进行初始构造,但是(如果它在那里的话)我没有掌握任何我需要了解的特殊方面,如果我的类将被继承,那么我将对此进行回顾。至于你建议中远高于我的薪酬等级的想法,我可能需要几天时间才能更好地理解它,但你对btree3初始化的猜测是正确的,因此我怀疑你关于如何解决这个问题的建议也可能是正确的。给我几天时间进行内化和编辑。谢谢@LGTrader:是的,链表示例只是从handle类继承而来,所以它并没有真正深入了解子类/超类构造函数问题。第一个链接应该对此有所帮助。祝你好运我将标记这个问题的解决,尽管真正向自己证明这一点,由于我的补救编程技能,可能需要花费太多的时间。不过我会继续努力。也就是说,我现在决定做的是,在我的例子中,二叉树是把所有这些东西结合在一起的粘合剂,而不是将btree3继承到EqTree中,我只是将EqTree数据放入一个结构中,并将其存储在给定节点的btree3数据中。这是一个非常小的改变,从我原来的概念证明代码,以及在我的能力范围内。谢谢你的帮助!