2017-03-21 6 views
1

退職したハードウェアエンジニアに敬意を表し、Matlab Object Orientedプログラミングについて学んでください。継承 - 基本クラス関数は派生クラスデータを割り当てることができますか?

私はバイナリツリークラスのために、ウォーク、プルーニング、追加、単純なバイナリツリーの配線のための特別な機能を多数備えています。私は自分のクラス(classdef btree3 <ハンドル)を約20個のメソッドで作成し、それらをテストしました。これまでのところうまく動作しています。

次へ私は、バイナリツリー(classdef EqTree < btree3)を継承するツリーを1回使用するための特定のクラスを作成しました。一般的に、これはすべてのbtree3方法はEqTreeオブジェクトから呼び出し可能であることで動作します:X3は、ノードのどれもさらに下では、それにEqTreeデータのプロパティを持っていながら、

X3 = EqTree; 
X3.GenerateRandomTree(50,8); 
X3.RenumberTree(100); 
disp('Walking X3 tree'); 
X3.WalkTree; 

私がいる問題があります彼らは持っている。すべての下位ノードは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.Left

ans =

特性を有する

btree3:二つの問題がある

NodeNum: 101 
    Prev: [1×1 EqTree] 
    Left: [0×0 btree3] 
    Right: [0×0 btree3] 

EqTree日がツリーの下方に割り当てられていない1)、及び

2)ポインタはn o均等に長く、btree3から継承したメソッドは、ツリーを歩いてルートでEqTreeオブジェクトを見つけると失敗します。

必要な場合は、ツリーをbtree3オブジェクトとして割り当て、EqTreeデータ(EqTreeクラスが単独である場合)をデータに取り込むことができます。

質問が十分にはっきりしていることを願っていますが、必要に応じてさらにコードを投稿することができます。

ありがとうございます!

日時: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クラスメソッド:

試してみて、余分されることをbtree3のGenerateRandomTreeメソッドは、btree3の他のメソッドを呼び出して実際に新しいメンバーをツリーに割り当てます。ツリーの左側に追加する場合、btree3はAddNodeLeftメソッドを呼び出します。このメソッドは、btree3クラスの一部であり、新しいbtree3オブジェクトの割り当てのみを認識します。これらはすべて継承され、EqTreeクラスによって呼び出されたときに機能しますが、新しいオブジェクトはBtree3オブジェクトであり、EqTreeオブジェクトではありません。私はここで、派生クラスのオブジェクトを割り当てる方法を理解するために願っています:

​​
+0

私の推測では、あなたがトンのための新たなコンストラクタメソッドを実装していないです彼はEqTreeクラスですか?もしあなたが持っていれば、それを投稿できますか? – gnovice

+0

まあ、私は意図したが、多分それは正しく行われていない?私はこのコメントにコードを投稿することができないので、元の投稿に追加します。 – LGTrader

+0

私はZ1 = EqTreeが動作しながら、Z2 = EqTree(100)は、それがbtree3オブジェクトが割り当てられているので、私は、EqTreeのNODENUM「読み取り専用プロパティを設定することはできません」が、私はおそらくこの方法を必要とする私に言っていないので、ことに注意してくださいんNodeNumを設定します。 – LGTrader

答えて

1

This documentation on class constructor methodsこのdoubly-linked list exampleと一緒に、ご案内役立つはずです。私はbtree3のコンストラクタはNodeNumPrevLeft、そしてRightを初期化することを推測しています。そのように、あなたのEqTreeコンストラクタは、おそらく次のようになります。

function ThisNode = EqTree(NodeNum) 
    args = {}; 
    if (nargin > 0) 
     args = {NodeNum}; 
    end 
    ThisNode = [email protected](args{:}); 
    % Other initializations specific to EqTree objects 
end 

彼らはemptyEqTreeオブジェクト(すなわちThisNode.Prev = EqTree.empty;)になるように、あなたが、ここにもでPrevLeft、そしてRightを再初期化する必要があるかもしれません。指定されたクラスのオブジェクトを作成AddNodeLeftのような他の方法、に関して

、あなたはlinked-list example内のパターンをたどるとにあなたの方法を書き換えることができ、むしろより与えられたクラスのオブジェクトを受け取り、内部で 1を作成します。その後、

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)); 
+0

ありがとうございます。私は実際には二重リンクリストの例を使って初期構造を作成しましたが、もしそこにあれば、私のクラスが継承されるかどうかを理解するために必要な特別な側面は把握できませんでした。私の給料等級の上にあるあなたの提案のアイデアに関しては、それを理解するのに数日かかるかもしれませんが、btree3の初期化についてのあなたの推測にスポットがあるので、この問題に対処する方法についてのあなたの提案もそうであると思われます。内面化して編集するのに数日をください。ありがとう! – LGTrader

+0

@LGTrader:うん、単にハンドルクラスから継承されたので、それは本当にサブクラス/スーパークラスのコンストラクタの問題に多くの洞察を与えていないリストの例をリンク。最初のリンクが役立ちます。がんばろう! – gnovice

+0

私はこれを解決してマークするつもりですが、本当に自分自身にそれを証明していますが、私の矯正プログラミングスキルのために時間がかかりそうです。しかし、私はそれに取り組んでいきます。つまり、私が今のところ決定したことは、バイナリツリーがすべてのものを一緒に保持する接着剤であり、btree3をEqTreeに継承するのではなく、単に構造とストアにEqTreeデータを入れるだけですそれは与えられたノードのためのbtree3のデータです。それは、私の元の概念証明コードから、そして私の能力の範囲内で、非常にマイナーな変更です。すべてのあなたの助けをありがとう! – LGTrader

関連する問題