1

对格式感到抱歉,我粘贴并应用了 {} 控件,但它看起来仍然损坏。如果我以某种方式滥用该工具,请教育我。

我有一个基类:

classdef SystemNode < matlab.mixin.Heterogeneous
    properties (Abstract)
       description 
       quantity
       parent 
       unit_cost
       learning_curve
       average_cost
       total_cost
       children
   end
end

我有一个后代:

classdef Subsystem < models.system.SystemNode
   properties
       description 
       quantity
       parent 
       children
       key
   end

   properties (Dependent)
       unit_cost
       learning_curve
       average_cost
       total_cost
   end

   methods
       function self = Subsystem(description, quantity, parent)
           % TODO: Validate Inputs
           self.description = description;
           self.quantity = quantity;
           self.parent = parent;
           self.children = [];
           self.key = char(java.util.UUID.randomUUID().toString());
       end

       function add_child(self, node)
           % TODO: Validate Inputs
           self.children = [self.children node];
       end

       function unit_cost = get.unit_cost(self)
           % Cost if there were only one.
           unit_cost = 0;
           for child = self.children
               unit_cost = child.unit_cost;
           end
           unit_cost = unit_cost*self.quantity;
       end

       function learning_curve = get.learning_curve(self)
           learning_curve = 0;



       end

我无法让 .add_child() 工作。例如:

>> ss = models.system.Subsystem('test', 1, []);
>> ss.add_child('a')
>> ss.children

ans =

     []

如果我从句柄而不是 Mixin 继承我的抽象类,这可以正常工作。我究竟做错了什么??

顺便提一句。我正在使用 Matlab 2011b

提前致谢。

4

1 回答 1

2

handle使对象以传递引用的方式运行。如果您想要这种行为,请尝试以下操作:

classdef SystemNode < matlab.mixin.Heterogeneous & handle

如果您不从 继承handle,您将获得正常的 Matlab 值传递行为。在这种情况下,如果要更新对象的状态,则必须从 setter 方法返回更新后的对象,并将返回的更新值存储起来。

所以 setter 必须返回更新后的 self。

   function self = add_child(self, node)
       self.children = [self.children node];
   end

并调用它存储返回的更新对象。

ss = ss.add_child('a')

如果您没有在 中存储新值ss,那么您仍在查看调用ss之前 from的值add_child,没有子级。

于 2013-04-25T22:20:33.623 回答