Пакеты являются специальными папками, которые могут содержать папки класса, функцию, и файлы определения класса и другие пакеты. Имена классов и функций ограничены по объему к папке пакета. Пакет является пространством имен, в котором имена должны быть уникальными. Имена функций и имена классов должны быть уникальными только в пакете. Используя пакет обеспечивает средние значения, чтобы организовать классы и функции. Пакеты также позволяют вам снова использовать имена классов и функций в различных пакетах.
Пакеты не поддержаны для классов, созданных до MATLAB® Version 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
Функция и пакет могут иметь то же имя. Однако имя пакета отдельно не является идентификатором. Поэтому, если избыточное имя происходит одно, оно идентифицирует функцию. Выполнение одного только имени пакета возвраты ошибка.
В случаях, где пакет и класс имеют то же имя, статический метод более приоритетен по сравнению с функцией пакета. Например, папка 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
fldrB/@foo/bar.m
В случаях, где та же папка 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