Использование абстрактных классов в Matlab (без свойств) - PullRequest
7 голосов
/ 20 марта 2012

Пусть у нас есть один абстрактный класс:

classdef ACalculation < handle

    methods (Abstract)
        [result] = calculate (this, data);

        plot (this, data, limX, limY);
    end

end

И некоторые другие классы, реализующие ACalculation

classdef Maximum < ACalculation

    methods
        function [result] = calculate (this, data)
            %...
        end

        function plot (this, data, limX, limY)
            %...
        end
end

Для функций класса реализации я даю всю необходимую информацию, поэтому мне не нужны никакие свойства. Похоже, мне нужны статические классы. Но если у меня есть статические классы, у меня проблема с вызовом этой функции. Я хотел бы сделать что-то подобное:

criteria = Maximum();
%......
result = criteria.calculate(data);

Это плохой способ использовать наследование? Должен ли я игнорировать советы Matlab для изменения функций на статические? Что еще я мог сделать здесь?

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

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

classdef ACalculation < handle

    methods (Abstract,Public,Static)
        [result] = calculate (data);    
        plot (data, limX, limY);
    end

end

classdef Maximum < ACalculation

    methods (Public,Static)
        function [result] = calculate (data)
            %...
        end

        function plot (data, limX, limY)
            %...
        end
end

Затем вы можете написать функцию, которая ожидает тип ACalculation:

 function foo(acalc,data)
      assert(isa(acalc,'ACalculation'));
      acalc.calculate(data);
      acalc.plot(data,[100 200]);
 end

Затем создайте Maximum пустой экземпляр ипередать его на foo:

 foo ( Maximum.empty(0), [1 2 3]);

Если вы хотите изменить метод расчета, позвоните

 foo ( Minimum.empty(0), [1 2 3]);

Когда вы говорите, что такой шаблон не будет работать, вы думаете, чтоJava / C # / C ++ разработчик.Но в отличие от C ++, где static и virtual ключевое слово не может сосуществовать, Matlab не имеет такого ограничения, потому что все выполняется во время выполнения, а «экземпляр» может быть пустым или массивом n элементов.

0 голосов
/ 20 марта 2012

Если calculate является статическим методом Maximum‘, you would use ‘result = Maximum.calculate(data) для его вызова, без создания экземпляра criteria.

Это не (обязательно) плохой способ использования наследования или плохой совет от MATLAB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...