exponenta event banner

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

Папки пакетов

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

Примечание

Пакеты не поддерживаются для классов, созданных до 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 содержит функцию пакета и папку пути 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

Если папка пути 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 

Связанные темы