Родитель-потомок (Parent-To-Children)



Используйте этот тип отношений, когда:

· Более чем один объект класса B (children) может ссылаться на объект класса A (parent)

· Объекты класса B не могут существовать независимо от объектов класса A.

Удаление объекта класса A удалит все связанные с ним объекты класса B.

Объект класса B не может изменить связанным с ним объект класса А на другой объект.

Пример:

Class User.Book Extends %Persistent [ClassType = persistent]
{
Relationship Chapters As User.Chapter [Cardinality = children, Inverse = Book];
}

Class User.Chapter Extends %Persistent [ClassType = persistent]
{
Relationship Book As User.Book [Cardinality = parent, Inverse = Chapters];
}

 

Мастер создания свойств

Для определения нового свойства нажмите на кнопку Новое свойство (значок «домик» в правой части панели инструментов) или в меню Класс последовательно выберите Добавить и Новое свойство.

В первом поле задайте имя свойства. При желании, вы можете ввести описание свойства в следующем поле; здесь допустимы теги HTML.

Следующий шаг — выбор типа свойства.

Задав Единичное значение типа..., вы можете выбрать тип данных из списка стандартных типов данных Cache, таких как %lnteger, %string, %Date и т.д., а также из классов типов данных, определенных разработчиками. Помимо этого, можно выбрать любой хранимый класс (чтобы создать на него ссылку) или встраиваемый класс (чтобы создать встроенный объект).

Выбрав Коллекцию типа..., вы должны указать ее тип: либо array, если это коллекция-массив, либо list, если это список.

Третий вариант - Поток типа... Укажите binary или character для BLOB'OB, содержащих, соответственно, двоичную или текстовую информацию.

Наконец, определив свойство как Отношение, вы сможете установить двустороннюю связь со свойством другого хранимого класса (в отдельном диалоговом окне).

Окно Характеристики свойствапредназначено для задания ряда дополнительных характеристик нового свойства.

Пометьте Обязательно, если свойству обязательно должно быть присвоено значение на момент сохранения объекта. На классы временных (transient) объектов эта установка не влияет.

Когда выбрана опция Уникальное, Cache автоматически создает для свойства индекс, организованный таким образом, что невозможно создать более одной записи с одинаковыми значениями этого свойства. Это обеспечивает уникальность таких ключевых полей, как номер клиента, VIN-код автомобиля или наименование документа.

Свойство, помеченное как Вычисляемое, не имеет хранимого значения, а вычисляется во время выполнения, когда это необходимо.

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

В диалоговом окне Параметры свойства перечислены параметры, определенные для типа данных свойства. Изначально им присвоены значения, унаследованые от соответствующего класса типа данных. Чтобы повысить специализацию типа данных, вы можете изменить эти унаследованные значения, например, указав максимальную длину строки (в нашем примере — 50 символов) или задав граничные значения числа. Используя определение типа данных и значения этих параметров, при компиляции класса Cache сгенерирует специализированный код проверки допустимости значений свойства.

Окно, показанное выше, позволяет указать, будут ли переопределяться методы доступа к значениям свойств (Set и Get). Когда соответствующее поле помечено, Cache вставляет сигнатуру метода в определение класса.

Это может потребоваться, например, для реализации вычисляемого поля. В объектном представлении данных вычисление производится методом свойства с именем ceoiicTBoGet(). Так, для вычисляемого свойства VAT (НДС) этот метод будет называться VATGet(). У него нет аргументов, и его возвращаемое значение рассматривается как значение вычисляемого свойства.

Отметим, что определение вычисляемых полей в SQL-представлении отличается от его объектного аналога. Cache поддерживает два различных подхода к этим определениям по той простой причине, что SQL-доступ оперирует с множествами записей таблиц, не создавая экземпляров объектов в памяти, а метод Get(), напротив, является методом экземпляров. Следовательно, он не может быть вызван при обработке SQL-запроса.

Поэтому мы прямо в CDL помечаем свойство как SqlComputed и вслед за ключевым словом SqlComputeCode вставляем соответствующий программный код. Его написание требует специального синтаксиса для обращения к SQL-полям: они помещаются в фигурные скобки. Это касается и результата вычисления.
Например:

Property AgelnYears As %Integer [ Calculated,
SqlComputeCode = { Set {AgelnYears} =$Horolog-{DOB}\365.2425},
SqlComputed ];

Методы

Методы – это операции, ассоциированные с объектом. Метод выполняется внутри Caché процесса. Каждый метод может иметь имя, список формальных параметров, возвращаемое значение и программный код. Имя метода должно быть уникально внутри своего класса. Как правило, методы реализованы в виде функций или процедур на языке Caché Object Script (COS). Параметры методу могут передаваться как по ссылке, так и по значению. Тип возвращаемого значения может быть каким угодно, но, как правило, это тип %Library.Status, который возвращает информацию о статусе завершения метода.

Есть методы классов и методы экземпляров. Для задания метода класса используется ключевое слово ClassMethod, для задания метода экземпляра используется ключевое слово Method.

Например, следующий синтаксис используется для задания метода класса:

ClassMethod <имя метода> (список параметров) [ключевые слова]
{ код }

Такой синтаксис используется для задания метода экземпляра:

Method <имя метода> (список параметров) [ключевые слова]
{ код }

Аргументы метода

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

Например, метод Calculate имеет три аргумента:

Method Calculate(count As %Integer, name, state As %String = "CA")
{
// ...
}

где count и state объявлены как %Integer и %String, соответственно. По умолчанию, типом данных необъявленного аргумента является тип %String, в нашем случае name имеет тип %String. Т.е. можно неявно задавать типы аргументов.

Определение значений по умолчанию для аргументов метода

Например:

Method Test(flag As %Integer = 0)
{
}

При вызове метода без аргументов, он будет использовать значение по умолчанию.

Передача аргументов по ссылке

По умолчанию, аргументы передаются методу по значению. Можно использовать передачу по ссылке, используя модификатор ByRef.

Например:

Method Swap(ByRef x As %Integer, ByRef y As %Integer)
{
Set temp = x
Set x = y
Set y = temp
}

Можно также определить аргументы, которые возвращаются по ссылке, но не имеют входного значения, используя модификатор Output. Это эквивалентно ByRef, за исключением того, что входное значение аргумента игнорируется.

Method CreateObject(Output newobj As MyApp.MyClass) As %Status
{
Set newobj = ##class(MyApp.MyClass).%New()
Quit $$$OK
}

В Caché Object Script при вызове метода, аргументы которого передаются по ссылке (ByRef или Output), нужно ставить точку перед каждым аргументом:

Do obj.Swap(.arg1, .arg2)

Возвращаемое значение метода

При определении метода задается, возвращает ли метод значение и если да, то задается его тип. Тип, возвращаемый методом, есть класс. Если возвращаемый тип есть класс типа данных, метод возвращает литеральное значение (такое как число или строка). В противном случае, метод возвращает ссылку (OREF) на экземпляр класса.

Синтаксис:

MethodMethodName() AsReturnType
{
}

где MethodName это метод, ReturnType задает имя класса, возвращаемого методом.

Например, следующий метод возвращает значение типа %Integer:

Method Add(x As %Integer, y As %Integer) As %Integer
{
Quit x + y
}

Пример метода, который создает и возвращает экземпляр объекта:

Method FindPerson(id As %String) As Person
{
Set person = ##class(Person).%OpenId(id)
Quit person
}

Видимость методов

Метод может быть public или private. Private-метод может использоваться только методами класса, которому принадлежит. Public-метод может использоваться любыми внешними методами. В Caché private-методы наследуются и являются видимыми внутри подклассов данного класса. В других языках данные методы носят название «защищенных» (protected).

 

Язык метода

При создании метода можно использовать следующие языки: "Caché" (Caché ObjectScript), "Basic", и "Java". По умолчанию, метод использует язык, определенный в ключевом слове его класса. Можно его перекрыть, используя ключевое слово класса Language.

Например:

Class MyApp.Test {

/// метод Basic
Method TestB() As %Integer [ Language = basic]
{
'код Basic
Print "Этотест"
Return 1
}

/// метод Cache ObjectScript
Method TestC() As %Integer [ Language = cache]
{
// код Cache ObjectScript
Write "Этотест"
Quit 1
}
}

Внутри класса можно использовать для реализации методов и другие языки. Все методы взаимодействуют, не взирая на конкретный язык реализации. Методы, написанные на языке Caché ObjectScript и Basic, компилируются в выполнимый Caché-код. Java-методы выполняются по-другому. Когда создается Java-представление класса (с использованием Caché Java Binding), все Java-методы генерируются непосредственно в Java-код. Это означает, что все Java-методы выполняются внутри родной JVM (виртуальной Java машины) и получают доступ к полноценной Java-среде.

Ключевые слова метода

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

Основные ключевые слова:

· ClassMethod – определяет метод как метод класса. По умолчанию, методы являются методами экземпляров. Подклассы не могут изменить значение ключевого слова ClassMethod.

· Description – обеспечивает необязательное описание метода, которое используется для построения документации класса. По умолчанию, метод не имеет описания. Подклассы не наследуют значение описания.

· Final – означает, что подклассы не могут перекрыть метод, т.е. метод финальный. По умолчанию, методы не являются финальными. Ключевое слово Final наследуется подклассами.

· Private – задает, что данный метод может быть вызван только методами этого же класса или подклассов ( если метод не является private, тогда ограничений на вызов метода нет). Подклассы наследуют private-методы и могут изменять значение этого ключевогослова. По умолчанию методы являются public.

· ReturnType – определяет тип возвращаемого значения. Установка ReturnType равным пустой строке (""), означает, что нет возвращаемого значения. Значение ReturnType наследуется подклассами и может быть изменено в подклассе. По умолчанию, метод не имеет возвращаемого значения.

· SQLProc – задает метод как хранимую процедуру SQL. По умолчанию метод не является хранимой процедурой.

Методы класса и экземпляров

Методы экземпляров используются, если создан экземпляр объекта. Причем внутри метода сам объект доступен с помощью синтаксиса ##this.

Например:

setsc= ##this.%Save()

В данном примере экземпляр объекта доступен через ##this, %Save – метод экземпляра.

Метод класса не относится к конкретному экземпляру. Метод класса вызывается без ссылки на объект, поэтому синтаксис ##this в них отсутствует. Свойства и методы экземпляра для них не имеют смысла. Методам класса доступны параметры класса.

Примеры методов класса:

%New() – создать экземпляр объекта.
%OpenId() – открыть существующий экземпляр
%DeleteId() – удалить экземпляр в базе данных.

Вызов метода

Для вызова метода экземпляра сначала нужно создать или открыть экземпляр объекта. Для выполнения метода используется синтаксис, подобный одной из следующих строк кода:

Do oref.MethodName(arglist)

Set value = oref.MethodName(arglist)

где oref это ссылка на подходящий объект, который уже находится в памяти, MethodName это имя метода для выполнения, arglist это список аргументов передаваемых методу, во второй строке локальной переменной присваивается значение, возвращаемое методом.

Например, для выполнения метода Admit объекта Patient используется следующий код:

Do pat.Admit()

где pat это OREF на желаемый объект Patient.

Аналогично, для выполнения метода SearchMedicalHistory объекта Patient используется следующий код:

Set result = pat.SearchMedicalHistory("MUMPS")

Где pat это OREF-ссылка на желаемый объект Patient и result содержит значение, возвращаемое методом SearchMedicalHistory.

Метод класса выполняется без создания экземпляра. Можно выполнить метод класса из метода того же класса. В этом случае, можно вызвать метод класса, как если бы вызывался метод экземпляра.

Для выполнения метода класса используется следующий синтаксис:


Дата добавления: 2018-05-12; просмотров: 325; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!