Проект конструкторов подкласса

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

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

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

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

Subclass Constructors предоставляет дополнительные сведения о создании методов конструктора подкласса.

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

Если суперкласс содержится в пакете, включите имя пакета. Для примера, 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 конструктор классов поддерживает случай отсутствия аргументов со 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

Похожие темы