2012-01-24 2 views
4

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

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

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

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

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

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

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

EDIT:

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

% 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) 

и т.д.,

Надежда, что помогает кто-то еще занимается этими вопросами

ответ

2

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

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

+0

Спасибо за ответ, не могли бы вы объяснить больше, что вы имеете в виду в своем последнем предложении? –

+2

Несомненно. Композиция имеет один объект, «содержащий» другой. Class1 хранится в свойстве Class2, а Class2 использует Class1 как «черный ящик». Это часто используется, чтобы «украсить» класс, т. Е. Поставить на него другой интерфейс. Здесь есть отличная дискуссия: http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance и здесь: http: //lostechies.com/chadmyers/2010/02/13/composition-versus-inheritance/ – Marc

+0

Конечным решателем, который я часто использовал, является вопрос о необходимости замены одного класса другим во время выполнения. Хороший пример из графических интерфейсов: простой GUI может иметь родительский элемент «Window» и два подтипа: «Модальные» и «Немодные» диалоги. Можно представить, что для рисования на экране он должен содержать список «Windows», и все равно, какой тип они были. Если вы используете наследование для совместного использования кода и функций, вам, вероятно, следует предпочесть состав. – Marc

Смежные вопросы