|
Программирование >> Хронологические базы данных
Поскольку одни объекты могут ссылаться на любые другие объекты с помощью идентификаторов, один объект может совместно использоваться несколькими другими объектами. В частности, один и тот же объект может одновременно относиться к нескольким различным коллекциям объектов. В продолжение рассматриваемого примера приведем еще одно выражение. CLASS EMP COLL PUBLIC ( EMPS REF ( SET ( REF ( EMP ))))... ; ALL EMPS := EMP COLL NEW ( ) ; ALL EMPS ADD ( E ) ; Пояснения Объект класса EMP COLL содержит одну открытую переменную экземпляра EMPS, значением которой является указатель (идентификатор) на изменяемый объект, значение которого представляет собой набор указателей на отдельные объекты класса ЕМР. ALL EMPS - это программная переменная, значением которой является идентификатор объекта класса EMP COLL. После выполнения операции присвоения она будет содержать идентификатор объекта, значением которого, в свою очередь, будет идентификатор пустого множества идентификаторов объектов ЕМР. ADD - это метод объектов класса EMP COLL. В рассматриваемом примере данный метод применяется для объекта класса, идентификатор которого содержится в программной переменной ALL EMPS, и предназначается для добавления идентификатора объекта ЕМР, который содержится в программной переменной Е, к набору идентификаторов (изначально пустому). Причем идентификатор этого набора содержится в объекте EMP COLL, идентификатор которого находится в программной переменной ALL EMPS. Рассмотрев приведенную выще последовательность операций, можно заметить, что переменная ALL EMPS связана с набором объектов ЕМР, который в текущий момент содержит только один объект, а именно - объект, описывающий сотрудника с номером Е001. (Помимо всего прочего, обратите внимание на то, что необходимо упомянуть значение ключа пользователя в последнем предложении!) Конечно, в некоторый заданный момент может существовать любое количество разных и, возможно, перекрывающихся наборов сотрудников , например следующих. PROGRAMMERS := EMP COLL NEW ( ) ; PROGRAMMERS ADD ( E ) ; HIGHLY PAID := EMP COLL NEW ( ) ; HIGHLY PAID ADD ( E ) ; Приведенный ниже пример SQL-выражения показывает, что в реляционных системах все может быть организовано совсем иначе. ] CREATE TABLE ЕМР ( ЕМР# ... , ENAME ... , SALARY ... , POSITION ...)...; В этом случае тип и коллекция создаются одновременно, причем сложный тип соответствует заголовку таблицы, а исходно пустая коллекция соответствует содержанию таблицы. Точно так же приведенное ниже SQL-выражение позволяет одновременно создать отдельную строку ЕМР и добавить ее к коллекции ЕМР. INSERT INTO ЕМР ( ... ) VALUES (...); Можно сделать вывод, что организация этих действий с помощью языка SQL характеризуется следующими особенностями. 1. Отдельный объект класса ЕМР не может существовать, не являясь частью некоторой коллекции , фактически - какой-то единственной коллекции (подробности приведены ниже). 2. Не существует непосредственного способа создания двух различных коллекций объектов одного и того же класса ЕМР (подробности приведены ниже). 3. Не существует непосредственного способа совместного использования одного и того же объекта в нескольких коллекциях объектов ЕМР (подробности приведены ниже). Именно такие претензии иногда можно услышать, однако они не выдерживают серьезной критики. Во-первых, для достижения равноценного эффекта в каждом случае может применяться реляционный метод использования внешнего ключа. Например, можно определить две базовые таблицы, PROGRAMMERS (программисты) и HIGHLY PAID (высокооплачиваемые), каждая из которых состоит из номеров соответствующих сотрудников. Во-вторых, что еще важнее, для достижения того же эффекта может быть применен реляционный метод с использованием представлений. Например, таблицы PROGRAMMERS и HIGHLY PAID можно определить как представления, созданные на основе базовой таблицы ЕМР. CREATE VIEW PROGRAMMERS AS SELECT EMP#, ENAME, SALARY, POSITION FROM EMP WHERE POSITION = Programmer ; CREATE VIEW HIGHLY PAID AS SELECT EMP#, ENAME, SALARY, POSITION FROM EMP WHERE SALARY > <некоторое значение, например lb 000> ; Теперь один и тот же объект сотрудника можно одновременно разместить в двух или более коллекциях . Кроме того, участие в коллекциях, которые являются представлениями, управляется системой автоматически, а не программистом вручную. Завершая эту тему, следует упомянуть об одной интересной параллели, существующей между изменяемыми объектами объектных систем и явно заданными динамическими переменными некоторых языков программирования (например, базовыми переменными языка PL/I). Как и в случае изменяемых объектов данного класса, может суще- ствовать любое количество отдельных явных динамических переменных данного типа, память для которых выделяется во время выполнения явно заданными указаниями программиста. Более того, эти отдельные переменные, как и отдельные изменяемые объекты, не имеют имен, а потому на них можно ссылаться только с помощью указателей. Например, в языке PL/1 можно записать такую последовательность выражений. DCL XYZ INTEGER BASED ; /* XYZ - базовая переменная */ DCL Р POINTER ; /* Р - указатель */ ALLOCATE XYZ SET ( Р ); /* создание нового экземпляра XYZ, */ /* на который указывает Р */ Р -> XYZ = 3 ; /* присвоение значения 3 экземпляру */ /* XYZ, на который указывает Р */ Этот записанный на языке PL/I код очень похож на рассмотренный ранее объектный код. В частности, объявление базовой переменной подобно объявлению класса объектов, а операция ALLOCATE - созданию нового экземпляра объекта этого класса. Таким образом, основная причина, по которой в объектной модели необходимы идентификаторы, заключается в том, что те объекты, которые они идентифицируют, не обладают уникальными именами (точно так же, как базовые переменные в языке PL/I). Иерархии классов Описание концепций объектного подхода было бы неполным без рассмотрения иерархий классов (их не следует путать с иерархиями вложения). Однако объектная концепция иерархии классов , в сущности, является тем же, что и концепция иерархии типов, рассмотренная в главе 19. Следовательно, здесь можно ограничиться несколькими краткими определениями (большей частью это перефразированные выражения из главы 19) и соответствующими примерами. Замечание. Напомним, что в объектном мире, как и в остальных случаях, все еще нет полной согласованности относительно концепции абстрактной модели наследования, поэтому различные системы наследования существенно отличаются одна от другой на уровне деталей. Начнем с того, что объектный класс Y является подклассом класса X, а объектный класс X - суперклассом объектного класса Y тогда и только тогда, когда каждый объект класса Y обязательно является и объектом класса X (т.е. Y ISA X ). В этом случае объект класса Y наследует переменные экземпляра и методы класса X. Наследование переменных экземпляра обычно называют наследованием структуры, а наследование методов - наследованием поведения. В истинно объектных системах не может быть наследования структуры, а возможно лишь наследование поведения (по крайней мере для скаляров и инкапсулированных объектов), поскольку нет структуры для наследования (т.е. пользователю никакая структура не видна). Однако на практике объектные системы обычно несовершенны и в какой-то мере поддерживают структурное наследование, которое, подчеркиваем, означает наследование открытых переменных экземпляра. Если класс Y является подклассом класса X, то пользователю предоставляется возможность применять объект класса Y вместо объекта класса X везде, где это допустимо, т.е. в качестве аргумента различных методов. Этот принцип называется принципом подстановки и весьма полезен для повторного использования кода. Однако, посколь-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |