Папки, содержащие определения классов

Определения классов на пути

Чтобы вызвать метод класса, определение класса должно быть на пути MATLAB®, как описано в следующих разделах.

Папки Class и Path

Существует два типа папок, которые могут содержать файлы определения класса.

  • Папки пути — папка находится на пути MATLAB, и имя папки не начинается с символа @. Используйте этот тип папки когда это необходимо несколько классов в одной папке. Однако целое определение класса должно содержаться в одном файле .m.

  • Папки класса — имя папки начинается символ, сопровождаемый именем класса. Папка не находится на пути MATLAB, но его родительская папка находится на пути. Используйте этот тип папки когда это необходимо, чтобы использовать несколько файлов для одного определения класса.

Смотрите, что path функционирует для получения информации о пути MATLAB.

Используя папки пути

Файлы определения класса в папках находятся на пути MATLAB. Поэтому определения классов, помещенные в папки пути, ведут себя как любая обычная функция относительно приоритета — первое вхождение имени на пути MATLAB более приоритетно по сравнению со всеми последующими случаями того же имени.

Имя каждого файла определения класса должно совпадать с именем класса, который задан с ключевым словом classdef. Используя папку path избавляет от необходимости создавать отдельную папку класса для каждого класса. Однако целое определение класса, включая все методы, должно содержаться в одном файле.

Предположим, что у вас есть три класса, заданные в одной папке:

.../path_folder/MyClass1.m
.../path_folder/MyClass2.m
.../path_folder/MyClass2.m

Чтобы использовать эти классы, добавьте path_folder в свой путь MATLAB:

addpath path_folder

Используя папки класса

Имя папки класса всегда начинается с символа @, сопровождаемого именем класса для имени папки. Папка класса должна содержаться в папке path, но папка класса не находится на пути MATLAB. Поместите файл определения класса в папке класса, которая также может содержать файлы отдельного метода. Файл определения класса должен иметь то же имя как папка класса (без символа @). Определение класса (начинающийся с ключевого слова classdef) должно появиться в файле перед любым другим кодом (пробел, и комментарии не составляют код).

.../parent_folder/@MyClass/MyClass.m
.../parent_folder/@MyClass/myMethod1.m
.../parent_folder/@MyClass/myMethod2.m

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

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

Базовое имя каждого файла должно быть допустимым именем функции MATLAB. Допустимые имена функций начинаются с буквенного символа и могут содержать буквы, числа или символы нижнего подчеркивания. Для получения дополнительной информации см. Методы в Отдельных Файлах.

Функции в частных папках в папках класса

Частные папки содержат функции, которые сразу доступны только от функций, определяемых в папках выше папки private. Любые функции, определяемые в папке private в папке класса становятся методами класса, которые имеют доступ private.

Если папка класса содержит папку private, только класс, заданный в той папке, может функции доступа, заданные в папке private. Подклассы не имеют доступа к закрытым функциям суперкласса. Для получения дополнительной информации о частных папках смотрите Закрытые функции.

Если вы хотите, чтобы подкласс имел доступ к закрытым функциям суперкласса, задайте функции как защищенные методы суперкласса. Задайте методы с набором атрибута Access к protected.

Диспетчеризация методам в частных папках

Если класс задает функции в папке private, которая находится в папке класса, то MATLAB следует этим правилам приоритета при диспетчеризации закрытым функциям по сравнению с локальной функцией, заданной в файле classdef:

  • Используя запись через точку (obj.methodName), функция в папке private более приоритетна по сравнению с локальной функцией, заданной в файле classdef.

  • Используя функциональное обозначение (methodName(obj)), локальная функция, заданная в файле classdef, более приоритетна по сравнению с функцией в папке private.

Никакие определения классов в частных папках

Вы не можете поместить определения классов (файл classdef) в частных папках, потому что выполнение так не удовлетворило бы требования для папок class или path.

Приоритет класса и путь MATLAB

Когда существует несколько файлов определения класса с тем же именем, расположение файла на пути MATLAB определяет приоритет файла. Все файлы определения класса перед классом на пути более приоритетны, содержатся ли определения в папке класса. Класс более приоритетен по сравнению со всеми файлами определения класса, происходящими позже путь.

Например, рассмотрите путь со следующими папками, содержа обозначенные файлы.

Закажите в путиПапка и файлФайл задает

1

fldr1/Foo.m

Класс Foo

2

fldr2/Foo.m

Функциональный Foo

3

fldr3/@Foo/Foo.m

Класс Foo

4

fldr4/@Foo/bar.m

Метод bar

5

fldr5/Foo.m

Класс Foo

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

Класс fldr1/Foo.m более приоритетен по сравнению с классом fldr3/@Foo потому что:

  • fldr1/Foo.m перед fldr3/@Foo на пути

Класс fldr3/@Foo более приоритетен по сравнению с функциональным fldr2/Foo.m потому что:

  • fldr3/@Foo является классом в папке класса

  • fldr2/Foo.m не является классом

  • Классы в папках класса более приоритетны по сравнению с функциями

Функциональный fldr2/Foo.m более приоритетен по сравнению с классом fldr5/Foo.m потому что:

  • fldr2/Foo.m прибывает перед классом fldr5/Foo.m на пути

  • fldr5/Foo.m не находится в папке класса

  • Классы, которые не заданы в папках класса, повинуются порядку пути относительно функций.

Класс fldr3/@Foo более приоритетен по сравнению с классом fldr4/@Foo потому что:

  • Метод bar не распознан частью класса Foo, заданного в fldr3/@Foo.

Если fldr3/@Foo/Foo.m не содержит ключевое слово classdef (то есть, это - класс MATLAB до Версии 7.6), то fldr4/@Foo/bar.m становится методом класса Foo, заданного в fldr3/@Foo

Предыдущее поведение классов, заданных в папках класса

В Версиях 5 - 7 MATLAB папки класса не делают тени другие папки класса, имеющие то же имя, но находящиеся в более поздних папках пути. Вместо этого класс использует комбинацию методов от всех папок класса, имеющих то же имя, чтобы задать класс. Это поведение больше не поддерживается.

Для обратной совместимости классы, заданные в папках класса всегда, более приоритетны по сравнению с функциями и скриптами, имеющими то же имя. Этот приоритет применяется к функциям и скриптам, которые появляются перед этими классами в путь.

Изменение пути, чтобы обновить определение класса

Изменение вашего пути MATLAB может изменить файл определения класса для класса (см. path). Однако для классов, которые заданы в папках пути (то есть, не в классе папки @), необходимо очистить класс, прежде чем MATLAB распознает новую папку текущим определением класса.

Определения классов в папках класса

Предположим, что вы задаете две версии класса под названием Foo в двух папках, fldA и fldB.

fldA/+FooPkg/@Foo/Foo.m
fldB/+FooPkg/@Foo/Foo.m

Добавьте папку fldA в верхнюю часть пути.

addpath fldA

Создайте экземпляр класса FooPkg.Foo. MATLAB использует fldA/+FooPkg/@Foo/Foo.m в качестве определения класса.

a = FooPkg.Foo;

Измените текущую папку на fldB.

cd fldB

Текущая папка является всегда первой на пути. Поэтому MATLAB находит fldB/+FooPkg/@Foo/Foo.m как определение для класса FooPkg.Foo.

b = FooPkg.Foo;

MATLAB автоматически обновляет существующий экземпляр, a, чтобы использовать новое определение класса в fldB.

Определения классов в папках пути

Предположим, что вы задаете две версии класса под названием Foo в двух папках, fldA и fldB, но не используете папку класса.

fldA/+FooPkg/Foo.m
fldB/+FooPkg/Foo.m

Добавьте папку fldA в верхнюю часть пути.

addpath fldA

Создайте экземпляр класса FooPkg.Foo. MATLAB использует fldA/+FooPkg/@Foo/Foo.m в качестве определения класса.

a = FooPkg.Foo;

Измените текущую папку на fldB.

cd fldB

Текущая папка является эффективно верхней частью пути. Однако MATLAB не идентифицирует fldB/+FooPkg/Foo.m как определение для класса FooPkg.Foo. MATLAB продолжает использовать исходное определение класса, пока вы не очищаете класс.

Чтобы использовать определение FooPkg.Foo в foldB, очистите FooPkg.Foo.

clear FooPkg.Foo

MATLAB автоматически обновляет существующие объекты соответствовать определению класса в fldB. В большинстве случаев очистка переменных экземпляра является ненужной.

Похожие темы