Пакеты создают пространства имен

Папки с пакетом

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

Примечание

Пакеты не поддерживаются для классов, созданных до 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 рассматривает их все как один пакет. Если избыточно именованные пакеты в разных папках путей определяют одно и то же имя функции, то MATLAB находит только одну из этих функций.

Разрешение избыточных имен

Предположим, что пакет и класс имеют одинаковое имя. Для примера:

fldr_1/+foo
fldr_2/@foo/foo.m

Вызов which foo возвращает путь к исполняемому конструктору классов:

>> which foo
fldr_2/@foo/foo.m

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

Функции пакета по сравнению со статическими методами

В случаях, когда пакет и класс имеют одинаковое имя, функция пакета имеет приоритет над статическим методом. Для примера пути папку fldrA содержит функцию пакета и папку path 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.bar
fldr/+foo/bar.m

Если папка path 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.bar
fldr/+foo/bar.m 

Похожие темы