Matlab 继承-基类函数可以分配派生类数据吗?

Matlab 继承-基类函数可以分配派生类数据吗?,matlab,class,oop,inheritance,Matlab,Class,Oop,Inheritance,当这位退休的硬件工程师学习Matlab面向对象编程时,请对他温和一点 我对一个二叉树类有多种需求,其中包含一系列特殊函数,用于遍历、修剪、添加、重新布线一个简单的二叉树。我已经用大约20个方法编写了我自己的类(classdefbtree3

当这位退休的硬件工程师学习Matlab面向对象编程时,请对他温和一点

我对一个二叉树类有多种需求,其中包含一系列特殊函数,用于遍历、修剪、添加、重新布线一个简单的二叉树。我已经用大约20个方法编写了我自己的类(classdefbtree3 接下来,我为继承二叉树的树编写了一个特定的类(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]
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数据中。这是一个非常小的改变,从我原来的概念证明代码,以及在我的能力范围内。谢谢你的帮助!