Спроектируйте конструкторов подкласса

Эксплицитный вызов конструктора суперкласса

Явным образом вызов каждого конструктора суперкласса из конструктора подкласса позволяет:

  • Передайте аргументы конструкторам суперкласса

  • Управляйте порядком, в котором MATLAB® вызывает конструкторов суперкласса

Если вы явным образом не вызываете конструкторов суперкласса из конструктора подкласса, MATLAB неявно вызывает этих конструкторов без аргументов. Конструкторы суперкласса не должны поддерживать синтаксис аргумента, чтобы поддержать неявные вызовы.

MATLAB не гарантирует определенного порядка вызова, когда будет несколько суперклассов. Если порядок, в котором MATLAB вызывает конструкторов суперкласса, важен, вызовите конструкторов суперкласса явным образом из конструктора подкласса.

Если вы не задаете конструктора подкласса, можно вызвать конструктора по умолчанию с аргументами суперкласса. Для получения дополнительной информации см. Конструктора по умолчанию и Неявный Вызов Наследованного Конструктора.

Вызовите конструктор суперкласса от подкласса

Чтобы вызвать конструктора для каждого суперкласса в рамках конструктора подкласса, используйте следующий синтаксис:

obj@SuperClass1(args,...);

...

obj@SuperclassN(args,...);

Где obj выход конструктора подкласса, SuperClass... имя суперкласса и args любые аргументы, требуемые соответствующим конструктором суперкласса.

Например, следующий сегмент определения класса показывает что класс под названием Stocks это - подкласс класса под названием Assets.

classdef Stocks < Assets
   methods
      function s = Stocks(asset_args,...)
         if nargin == 0
            % Assign values to asset_args
         end
         % Call asset constructor
         s@Assets(asset_args); 
         ...
      end
   end
end

Конструкторы подкласса предоставляют больше информации о создании методов конструктора подкласса.

Ссылочные суперклассы, содержавшиеся в пакетах

Если суперкласс содержится в пакете, включайте имя пакета. Например, Assests класс находится в finance пакет:

classdef Stocks < finance.Assets
   methods
      function s = Stocks(asset_args,...)
         if nargin == 0
            ...
         end
         % Call asset constructor
         s@finance.Assets(asset_args); 
         ...
      end
   end
end

Инициализация объектов Используя несколько суперклассов

Чтобы вывести класс из нескольких суперклассов, инициализируйте объект подкласса с вызовами каждого конструктора суперкласса:

classdef Stocks < finance.Assets & Taxable
   methods
      function s = Stocks(asset_args,tax_args,...)
         if nargin == 0
            ...
         end
         % Call asset and member class constructors
         s@finance.Assets(asset_args)
         s@Taxable(tax_args)
         ...
      end
   end
end

Реализация конструктора подкласса

Гарантировать, что ваш конструктор класса поддерживает нулевой синтаксис аргументов, значения по умолчанию присвоения к переменным входного параметра прежде, чем вызвать конструктора суперкласса. Вы не можете conditionalize вызов подкласса конструктора суперкласса. Найдите вызовы конструкторов суперкласса вне любых условных блоков кода.

Например, Stocks конструктор класса не поддерживает случай аргумента с if оператор, но вызовы конструктор суперкласса за пределами if блок кода.

classdef Stocks < finance.Assets
   properties
      NumShares
      Symbol 
   end
   methods
      function s = Stocks(description,numshares,symbol)
         if nargin == 0
            description = '';
            numshares = 0;
            symbol = '';
         end
         s@finance.Assets(description);
         s.NumShares = numshares;
         s.Symbol = symbol;
      end
   end
end

Вызов только прямой суперкласс от конструктора

Вызов только прямые конструкторы суперкласса из конструктора подкласса. Например, предположите класс B выводит из класса A и класс C выводит из класса B. Конструктор для класса C не может вызвать конструктора для класса A инициализировать свойства. Класс B должен инициализировать класс A свойства.

Следующие реализации классов AB, и C покажите, как спроектировать это отношение в каждом классе.

Класс A задает свойства x и y, но присваивает значение только x:

classdef A
   properties
      x
      y
   end
   methods
      function obj = A(x)
         ...
            obj.x = x;
      end
   end
end

Класс B наследовал свойства x и y от класса A. Класс B конструктор вызывает класс A конструктор, чтобы инициализировать x и затем присваивает значение y.

classdef B < A
   methods
      function obj = B(x,y)
         ...
         obj@A(x);
         obj.y = y;
      end
   end
end

Класс C принимает значения для свойств x и y, и передачи эти значения к классу B конструктор, который в свою очередь вызывает класс A конструктор:

classdef C < B
   methods
      function obj = C(x,y)
         ...
         obj@B(x,y);
      end
   end
end

Похожие темы