Подтвердить что ты не робот

Множественный конструктор классов Matlab

Возможно ли определить более одного конструктора классов в Matlab? Если да, то как?

4b9b3361

Ответ 1

У каждого класса есть один конструктор. Однако... конструктор может принимать любое количество и тип аргументов, включая аргументы, основанные на varargin.

Итак, чтобы предоставить опцию третьего аргумента по умолчанию в Java, вы могли бы написать что-то вроде этого (примеры, основанные на документации Java):

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}
public Bicycle(int startCadence, int startSpeed) {
    gear = 1;
    cadence = startCadence;
    speed = startSpeed;
}

В Matlab вы могли бы написать

classdef Bicycle < handle
    properties (Access=public)
        gear
        cadence
        speed
    end
    methods (Access = public)
        function self = Bicycle(varargin)
            if nargin>2
                self.gear = varargin{3};
            else
                self.gear = 1;
            end
            self.cadence = varargin{1};
            self.speed = varargin{2};
        end
    end
end

Ответ 2

Каждый класс имеет только один конструктор, и каждый .m файл может содержать только одно определение класса.

Если вы хотите иметь класс с небольшими различиями в зависимости от ввода, вы можете использовать свойства, определяющие ключи, которые распознаются методами класса. Если вы хотите иметь очень разные классы в зависимости от ввода, вы можете создать generateClass -функцию, которая будет вызывать один или другой класс, определенный в разных файлах. Конечно, если эти разные классы имеют множество общих методов и свойств, вы можете создать их как подклассы для общего суперкласса.

Ответ 3

Ответ Pursuit работает, но пользователь, не знакомый с функцией, не может видеть, сколько аргументов необходимо или для чего они нужны. Я бы порекомендовал это:

methods (Access = public)
    function self = Bicycle(startCadence, startSpeed, startGear)
        if nargin>2
            self.gear = startGear;
        else
            self.gear = 1;
        end
        self.cadence = startCadence;
        self.speed = startSpeed;        
    end
end

Если вы сейчас наберете "Bicycle (") и подождите, вы увидите по крайней мере три аргумента. Хотя вторая возможность не показана. Это кажется возможным (например, для сюжета), но я не знаю, как это сделать.

Ответ 4

Нет. Конструкторы в ООП matlab очень ограничены по сравнению с другими языками. В документации AFAIK явно не указано, что у вас может быть несколько конструкторов, но в документации упоминается конструктор класса в единственном числе.

https://www.mathworks.com/help/matlab/matlab_oop/class-constructor-methods.html