Разработайте конструкторов подкласса

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

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

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

  • Управляйте порядком, в котором 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.

Следующие реализации классов, которые показывают A, B и 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

Похожие темы

Была ли эта тема полезной?