2016-12-04 158 views
2

我认为这是一个非常基本的问题,但我坚持这一点。在MATLAB中,我有一个超类super和子类sub更改子类的属性

现在我想超类的属性color从我的子类改变。所以我做了以下

classdef super < handle 

    properties 
     color = 'red'; 
    end 

    methods 
     function obj = super() 
      % ... 
     end 

     function obj = change_color(obj) 
      obj.color = 'blue'; 
     end 
    end 
end 

classdef sub < super 

    properties 
     name = 'car'; 
    end 

    methods 
     function obj = sub() 
      obj = [email protected](); 
      obj.change_color(); 
     end 
    end 
end 

接下来我做

super_obj = super(); 
sub_obj = sub(); 

但结果是,我不改变超类的属性,而是在子类中的继承属性被改变。我得到:

super_obj.color = 'red'; 
sub_obj.color = 'blue'; 

,但我想提前

super_obj.color = 'blue'; 

感谢。从超类下降到亚类:

+2

您只能更改*当前实例*的'color'属性。如果您创建两个“子”实例,它们将具有独立的颜色。 – Suever

+0

但是不存在任何可能性从继承的子类中改变超类的属性吗? – Lemonbonbon

+2

不可以。继承只有一个方向才是有道理的。如果您有两个想要将颜色更改为两个不同值的子类,该怎么办? – Suever

回答

2

因为继承在一个方向上流动这是不可能的。这是一个非常好的理由,因为如果你有两个试图将超类的属性修改为两个不同的东西的子类,你认为会发生什么?此外,如果您有两个子类实例,将其中一个color属性更改为另一个属性不会更改另一个属性的颜色属性,因为每个实例都从另一个实例中分离。

sub1 = sub(); 
sub2 = sub(); 

sub1.change_color(); 

sub1.color 
% 'blue' 

sub2.color 
% 'red' 

如果希望所有实例链接这样的,那么你可能想他们是对相同的实例参考,你应该使用singleton design pattern做到这一点。尽管如此,这只适用于同一类的对象,并不会影响超类。

+0

感谢您的详细解释。 – Lemonbonbon