Взаимодействие с конструкторами супер- и подклассов

У меня возникли проблемы с поиском помощи в документации Matlab и предыдущих вопросов об использовании наследования Matlab и конструкторов классов для создания интерфейса. Чтобы было аккуратно, в упаковке.

Вместо того, чтобы перетаскивать свой код, я могу сжать его следующим образом:

Пакет +MyPkg имеет суперкласс Super и несколько подклассов Sub1 Sub2... Большинство моих свойств и методов определены в Super, так что Sub1 и Sub2 на самом деле существуют только для использования своих конструкторов для простых подпрограмм или, возможно, нескольких методов, перегруженных из Super.

Итак, как мне написать classdefs и конструкторы для поддержки интерфейса, в котором я могу использовать следующие вызовы:

a = MyPkg.Super(args).Sub1(args)
b = MyPkg.Super(args).Sub1(args).Sub1Method

В этом случае я хочу сохранить аргументы, связанные с Super, отдельно от аргументов, связанных с Sub1, для удобочитаемости и организации.

Вопросы приветствуются.

РЕДАКТИРОВАТЬ:

После рассмотрения принятого ответа ниже и некоторого просмотра я пришел к выводу, что интерфейс, показанный выше, на самом деле не соответствует духу OO, и для моего приложения для анализа данных более правильный подход к нему будет состоять из класса дескриптора с конструктор, который заполняет объект или массив ячеек свойствами объекта. Поскольку класс является классом дескриптора, можно использовать его методы для создания желаемых методов. то есть следующее

% in +MyPkg\

classdef Super < handle
    properties
        outputArray
    end
    methods

    function self = Super(args)
        self.outputArray=load_values(args);
    end

    function out = do_analysis(self,params)
        % do some analysis
    end

    end
end

Затем использовать это:

data1 = MyPkg.Super(args)
% Populate the outputArray
analysis1 = data1.do_analysis(params)

так далее.,

Надеюсь, что это поможет кому-то другому справиться с этими проблемами


person St-Ste-Ste-Stephen    schedule 24.01.2012    source источник


Ответы (1)


Что касается вашего вопроса, вы не можете, если используете наследование. Из подклассов можно вызывать только прямые конструкторы суперкласса, и только из подкласса можно вызывать конструктор суперкласса. Ссылка

Такое раскрытие суперкласса действительно нарушает основы наследования. Может быть, вам следует подумать о другой модели, может быть, о композиции («имеет» вместо «является»), если вам нужен такой доступ?

person Marc    schedule 24.01.2012
comment
Спасибо за ответ, не могли бы вы подробнее объяснить, что вы имеете в виду в своем последнем предложении? - person St-Ste-Ste-Stephen; 25.01.2012
comment
Конечно. Композиция состоит в том, что один объект содержит другой. Класс 1 хранится в собственности класса 2, а класс 2 использует класс 1 в качестве черного ящика. Это часто используется для украшения класса, т. е. для добавления к нему другого интерфейса. Здесь есть отличное обсуждение: stackoverflow.com/questions/49002/ и здесь:lostechies.com/chadmyers/2010/02 /13/ - person Marc; 25.01.2012
comment
Окончательный решающий фактор, который я часто использовал, — это спросить себя, нужно ли вам заменить один класс другим во время выполнения. Хороший пример из GUI: простой GUI может иметь родителя Window и два подтипа: диалоги Modal и NonModal. Можно представить, что для рисования на экране он должен хранить список Windows, и ему все равно, какого они типа. Если вы используете наследование для совместного использования кода и функциональности, вам, вероятно, следует предпочесть композицию. - person Marc; 25.01.2012