Ваше решение является функциональным и включает в себя некоторую свободную типизацию MATLAB для достижения того, чего вы хотите.Однако получение чистого и структурированного ООП, вероятно, потребует потери некоторых функций, которые вы хотите.В то же время, лучший способ избежать дублирования кода - это шаблонные / универсальные классы контейнеров, но они не поддерживаются в MATLAB в настоящее время.
Ваш код отражает документацию MATLAB для Построение массивов в конструкторе и опирается на MATLAB, который является свободно типизированным языком, который позволяет вам без проблем преобразовывать объект в массив объектов.Использование этой мощной и гибкой функции MATLAB создает некоторые организационные проблемы и может подорвать ваши усилия по созданию чистого, объектно-ориентированного кода.Проблемы начинаются, потому что конструктор MyBaseClass не является истинным конструктором для MyBaseClass.
Википедия говорит :
"В объектно-ориентированном программировании конструктор (иногда сокращенный до ctor)в классе - это специальный тип подпрограммы, вызываемой при создании объекта. Он подготавливает новый объект для использования, часто принимая параметры, которые конструктор использует для установки любых переменных-членов, необходимых при первом создании объекта. Он называется конструктором.потому что он создает значения членов данных класса. "
Обратите внимание, что конструктор MyBaseClass не создает значения для членов объекта.Вместо этого это функция, которая устанавливает объект равным массиву объектов типа MyBaseClass и пытается установить их членов данных на какое-либо значение.Вы можете увидеть, где объект obj уничтожен при установке в массив здесь:
obj(numel(arg)) = eval(class(obj));
Это поведение особенно бесполезно, когда вы выводите MySubClass из MyBaseClass, потому что MyBaseClass не должен назначать новый объект переменной obj.---- MySubClass уже создал новый объект в obj и просто просит MyBaseClass построить часть существующего объекта в obj, для которой MyBaseClass знает подробности.
Определенную ясность можно получить, заметив, что при вводе конструктора для MyBaseClass и MySubClass переменная obj уже заполняется совершенно хорошим экземпляром класса.Хорошая практика ООП будет заключаться в том, чтобы сохранить этот исходный экземпляр, использовать его в конструкторе базового класса и действовать только для заполнения его членов в конструкторе ---- , а не , чтобы полностью перезаписать объект чем-то новым.Мой вывод заключается в том, чтобы не назначать obj массивом внутри MyBaseClass.Вместо этого я бы рекомендовал создать класс MyBaseClassArray, который создает массив объектов MyBaseClass.
К сожалению, вам также необходимо создать дубликат класса MySubClassArray, который создает массив объектов MySubClass.Такие языки, как C ++ и Java, обходят эту проблему дублирования кода с помощью шаблонов и шаблонов, соответственно, но MATLAB в настоящее время не поддерживает шаблоны в любой форме (http://www.mathworks.com/help/techdoc/matlab_oop/brqzfut-1.html). Без шаблонов нет хорошего способа избежать дублирования кода. Вы можете попытаться избежать некоторого дублированияпутем создания универсальной функции CreateClassArray, которая принимает имя строки класса для создания и аргументы конструктора для использования для каждого объекта - но теперь мы возвращаемся к коду, который выглядит как ваш оригинал. Единственное отличие состоит в том, что теперь у нас естьЧеткое разделение между классом массива и отдельными объектами. Правда в том, что, хотя MATLAB не поддерживает шаблоны, его гибкие классы и система типов позволяют вам использовать eval (), как вы должны изменять код и перезаписывать объект по желанию и создавать код, который действуетв целом по классам. Стоимость? Читабельность, скорость и чувство дискомфорта, которое вы испытывали, когда видели, как ваш базовый класс строит подкласс.
Короче говоря, вы использовали гибкость MATLAB для перезаписи obj в конструкторе массивом, чтобы избежать создания отдельного класса контейнера для MyBaseClass.Затем вы использовали eval, чтобы восполнить отсутствие в MATLAB функции шаблона, которая позволяла бы вам повторно использовать код создания массива всех типов.В конце концов, ваше решение является функциональным, уменьшает дублирование кода, но требует от ваших классов неестественного поведения.Это просто сделка, которую вы должны совершить.