exponenta event banner

Конструкторы подкласса проектирования

Явный вызов конструктора суперкласса

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

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

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

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

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

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

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

Например, Stocks конструктор класса поддерживает регистр no argument с 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

Связанные темы