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

Папки пакета

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

Примечание

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

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

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

В случаях, где пакет и класс имеют то же имя, функция пакета более приоритетна по сравнению со статическим методом. Например, папка path 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

В случаях, где та же папка path содержит и пакет и папки класса с тем же именем, функция пакета более приоритетна по сравнению со статическим методом.

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 

Похожие темы