Пакеты - это специальные папки, которые могут содержать папки классов, файлы функций и определений классов, а также другие пакеты. Имена классов и функций помещаются в папку пакета. Пакет - это пространство имен, в котором имена должны быть уникальными. Имена функций и классов должны быть уникальными только в пределах пакета. Использование пакета обеспечивает средства для организации классов и функций. Пакеты также позволяют повторно использовать имена классов и функций в различных пакетах.
Примечание
Пакеты не поддерживаются для классов, созданных до MATLAB ® версии 7.6 (то есть классов, которые не используютclassdef).
Папки пакетов всегда начинаются с + персонаж. Например,
+mypack +mypack/pkfcn.m % a package function +mypack/@myClass % class folder in a package
Родительский элемент папки пакетов верхнего уровня должен находиться в пути MATLAB.
Перечисление содержимого пакета с помощью help команда:
help event
Contents of event: EventData - event.EVENTDATA Base class for event data PropertyEvent - event.PROPERTYEVENT Event data for object property events listener - event.LISTENER Listener object proplistener - event.PROPLISTENER Listener object for property events
Вы также можете использовать what команда:
what event
Classes in directory Y:xxx\matlab\toolbox\matlab\lang\+event EventData PropertyEvent listener proplistener
MathWorks ® резервирует использование пакетов с именемinternal для служебных функций, используемых внутренним кодом MATLAB. Функции, принадлежащие internal предназначены только для использования MathWorks. Использование функций или классов, принадлежащих internal пакет не рекомендуется. Эти функции и классы не гарантируют последовательную работу от одной версии к другой. Любые из этих функций и классов могут быть удалены из программного обеспечения MATLAB в любом последующем выпуске без уведомления и без документации в примечаниях к выпуску продукта.
Все ссылки на пакеты, функции и классы в пакете должны использовать префикс имени пакета, если пакет не импортируется. (См. раздел Импорт классов.) Например, вызовите эту функцию пакета:
+mypack/pkfcn.m
С таким синтаксисом:
z = mypack.pkfcn(x,y);
В определениях не используется префикс пакета. Например, строка определения функции pkfcn.m функция будет включать только имя функции:
function z = pkfcn(x,y)Определите класс пакета только с именем класса:
classdef myClassно вызовите его с префиксом пакета:
obj = mypack.myClass(arg1,arg2,...);
Вызов методов класса не требует имени пакета, поскольку у вас есть объект класса. Можно использовать нотацию точки или функции:
obj.myMethod(arg) myMethod(obj,arg)
Для статического метода требуется полное имя класса, включающее имя пакета:
mypack.myClass.stMethod(arg)
В этот пакет включены функции, классы и другие пакеты, содержащиеся в пакете. Для ссылки на любой из элементов пакета необходимо присвоить имени пакета префикс, разделенный точкой. Например, следующий оператор создает экземпляр MyClass, которая содержится в mypack пакет.
obj = mypack.MyClass;
В этом разделе показано, как получить доступ к различным элементам пакета из-за пределов пакета. Предположим, что у вас есть пакет mypack со следующим содержанием:
+mypack +mypack/myFcn.m +mypack/@MyFirstClass +mypack/@MyFirstClass/myFcn.m +mypack/@MyFirstClass/otherFcn.m +mypack/@MyFirstClass/MyFirstClass.m +mypack/@MySecondClass +mypack/@MySecondClass/MySecondClass.m +mypack/+mysubpack +mypack/+mysubpack/myFcn.m
Вызовите myFcn функция в mypack:
mypack.myFcn(arg)
Создание экземпляра каждого класса в mypack:
obj1 = mypack.MyFirstClass; obj2 = mypack.MySecondClass(arg);
Вызовите myFcn функция, которая находится в пакете mysubpack:
mypack.mysubpack.myFcn(arg1,arg2);
Если mypack.MyFirstClass имеет метод с именем myFcn, вызовите его, как любой вызов метода для объекта:
obj = mypack.MyFirstClass; myFcn(obj,arg);
Если mypack.MyFirstClass имеет свойство с именем MyProp, назначьте его с помощью точечной нотации и объекта:
obj = mypack.MyFirstClass; obj.MyProp = x;
Невозможно добавить папки пакета к пути MATLAB, но необходимо добавить родительскую папку пакета к пути MATLAB. Элементы пакета недоступны, если родительская папка пакета отсутствует в пути MATLAB, даже если папка пакета является текущей папкой. Для добавления родительской папки пакета к пути недостаточно сделать текущую папку пакета.
Члены пакета остаются привязанными к пакету. Всегда ссылайтесь на участников пакета, использующих имя пакета. Также можно импортировать пакет в функцию, в которой вызывается элемент пакета, см. Импорт классов.
Папки пакетов не являются теневыми другими папками пакетов, расположенными позже по пути, в отличие от классов, которые делают теневые другие классы. Если два или более пакетов имеют одинаковое имя, MATLAB рассматривает их как один пакет. Если избыточно именованные пакеты в разных папках путей определяют одно и то же имя функции, то MATLAB находит только одну из этих функций.
Предположим, что пакет и класс имеют одинаковое имя. Например:
fldr_1/+foo fldr_2/@foo/foo.m
Вызов which foo возвращает путь к конструктору исполняемого класса:
>> which foo fldr_2/@foo/foo.m
Функция и пакет могут иметь одинаковые имена. Однако имя пакета само по себе не является идентификатором. Поэтому, если избыточное имя встречается одно, оно идентифицирует функцию. Выполнение только имени пакета возвращает ошибку.
В случаях, когда пакет и класс имеют одинаковые имена, функция пакета имеет приоритет над статическим методом. Например, путь к папке fldrA содержит функцию пакета и папку пути fldrB содержит статический метод класса:
fldrA/+foo/bar.m % bar is a function in package foo fldrB/@foo/bar.m % bar is a static method of class foo
Вызов which foo.bar возвращает путь к функции пакета:
which foo.bar
fldrA\+foo\bar.m % package function
В случаях, когда одна и та же папка пути содержит папки пакетов и классов с одинаковыми именами, функция пакета имеет приоритет над статическим методом.
fldr/@foo/bar.m % bar is a static method of class foo fldr/+foo/bar.m % bar is a function in package foo
Вызов which foo.bar возвращает путь к функции пакета:
which foo.barfldr/+foo/bar.m
Если папка пути fldr содержит classdef файл foo который определяет статический метод bar и та же самая папка содержит пакет +foo который содержит функцию пакета bar.
fldr/foo.m % bar is a static method of class foo fldr/+foo/bar.m % bar is a function in package foo
Вызов which foo.bar возвращает путь к функции пакета:
which foo.barfldr/+foo/bar.m