2016-12-04 3 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' * текущего экземпляра *. Если вы создадите два экземпляра 'sub', они будут иметь независимые цвета. – Suever

+0

Но разве нет возможности изменить свойство суперкласса из унаследованного подкласса? – Lemonbonbon

+2

№ Наследование распространяется только в одном направлении. Что делать, если у вас было два подкласса, которые хотели изменить цвет на два разных значения? – Suever

ответ

2

Это невозможно, поскольку наследование протекает в одном направлении: от суперкласса до подкласса. Это по очень веской причине, потому что, по-вашему, если бы у вас было два подкласса, которые пытались изменить свойство суперкласса color на две разные вещи?

Кроме того, если у вас есть два экземпляра подкласса, изменение свойства color в одном не изменит свойство цвета в другом, поскольку каждый экземпляр будет дезактивирован от другого.

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

sub1.change_color(); 

sub1.color 
% 'blue' 

sub2.color 
% 'red' 

Если вы хотите, чтобы все экземпляры должны быть связаны, как это, то вы, вероятно, хотите, чтобы они были ссылки на же экземпляр и вы должны использовать singleton design pattern для достижения этой цели. Но даже тогда это работает только для объектов одного класса и не влияет на суперкласс.

+0

Спасибо за подробное объяснение. – Lemonbonbon

Смежные вопросы