Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Ссылки на класс

Ссылки на класс – это элемент языка, позволяющий в процессе выполнения программы манипулировать не экземплярами классов, а самими классами. Т. е. ссылка на класс – это не класс, не объект, не ссылка на объект, а ссылка на тип данных класса. Тип данных ссылка на класс (СНК) определяет тип переменной – СНК. Предположим, что определен класс TMyClass. Определим новый тип данных СНК: type TMyClassRef = class of TMyClass. Теперь можно определить переменные обоих классов: var AClassRef: TMyClassRef;  AnObject: TMyClass.  Пример ипользования.  Begin  …  AClassRef:= TMyClass;  AnObject:= TMyClass. Create;  …  end  Ссылки на класс позволяют оперировать типами данных в процессе выполнения программы. Возможно использование ссылки на класс в любом выражении, в котором это допустимо. Таких выражений не много, но некоторый случаи представляют особый инетерес. Простейший случай – создание объекта:  AClassRef:= TMyClass  AnObject:= AClassRef. Create  Здесь конструктор применен к ссылке на класс вместо настоящего класса, т. е. ссылка на класс используется для создания  объекта этого класса.  Типы СНК не были бы такими полезными, если бы они не удовлетворяли такому же правилу совместимости типов, которое применимо к классам. Т. е. если в программе объявлена ссылка на класс, то можно как соответствующий конкретный класс, так и любой из его потомков. Например:  AClassRef:= TMyNewClass  В библиотеке времени выполнения и библиотеке визуальных компонентов Delphi:  TClass = class of Object;  ExceptClass = class of Exception;  TComponentClass = class of TComponent;  TControlClass = class of TControl;  TFormClass = class of TForm.  В частности, тип СНК TClass может хранить ссылку на любой класс, потому что любой класс является производным от TObject. Ссылка TFormClass используется в исходном коде большинства процессов в Delphi. Метод CreateForm объекта Application требует в качестве параметра класс формы, которую нужно создать: Application. CreateForm(TForm1,Form1). Ссылку на класс можно применить к методам связанного с ней класса. Т. к. каждый класс наследуется от TObject, любую ссылку на класс можно применить к его методам.

НЕ нашли? Не то? Что вы ищете?
Создание компонентов при помощи ссылок на класс

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

Интерфейсы

Определяя абстрактный класс, являющийся базовым классом иерархии, можно обнаружить, что разрабатываемый класс является настолько абстрактным, что в его состав входят лишь виртуальные методы, ни один из которых не будет реализован в рамках этого класса. Такой чисто абстрактный класс может быть определен с помощью ключевого слова interface и подобные классы называются интерфейсами. Интерфейс определяет набор функций и процедур, которые могут быть реализованы для взаимодействия программы с объектом. Определение конкретного интерфейса известно как разработчику, так и пользователю интерфейса и воспринимается как соглашение о правилах объявления и использования конкретного интерфейса. В классе может быть реализовано несколько интерфейсов, что делает его многоликим. Может быть наоборот, интерфейс может быть реализован несколькими способами, и в зависимости от потребностей можно использовать ту или иную реализацию. С формальной точки зрения, интерфейс не является классом и рассматривается как отдельный элемент языка, обладающий следующими свойствами. 1. При работе с объектами интерфейсного типа, осуществляется автоматический подсчёт ссылок на эти объекты. Когда ни одной ссылки на такой объект не остаётся, происходит автоматическое уничтожение этого объекта. 2. Класс-потомок может  обладать единственным классом-предком. Но при этом, Ом может обладать несколькими интерфейсами. 3. Все классы являются потомками класса TObject, а все интерфейсы – потомки класса IInterface.  C более общей точки зрении, интерфейсы поддерживают несколько иную объектно-ориентированную программную модель, чем классы. Объекты, содержащие в своём составе интерфейсы, подчиняются полиморфизму каждого интерфейса, который они поддерживают.  Интерфейсы благоприятствуют инкапсуляции и обеспечивают более свободные связи между классами, чем наследование.  Интерфейсы, как и классы, объявляются глобально в программе или модуле.  IAdmin = interface(IInterface)  ['{26F089CD-EECB-495A-9D87-65516BC512E7}']  function watch(index: integer): string;  function add(item: pointer): integer;  procedure clear;  procedure SetNum(Value: integer);  function GetNum: integer;  property num: integer read GetNum write SetNum; end; GUID – уникальный цифровой идентификатор, назначаемый каждому из зарегистрированных интерфейсов Windows. Генерируется по Ctrl+Shift+G.  Список членов интерфейса может включать методы и свойства. Поля не должны появляться в описании интерфейсов, соответственно спецификаторы read и write указывают только на методы. Все члены интерфейса считаются объявленными public, спецификаторы видимости и хранения не используются. Интерфейсы не имеют конструкторов и деструкторов. Экземпляр интерфейсного типа создается с помощью класса, реализующего интерфейс. Объявив интерфейс, можно определить реализующий его класс.  TMyList = class(TInterfacedObject, IAdmin, IUser) private  persons: TList;  public  constructor create;  function add(item: pointer): integer;  function watch(index: integer): string;  function IUser. watch=watch1;  function watch1(index: integer): string;  procedure clear;  procedure SetNum(Value: integer);  function GetNum: integer;  property num: integer read GetNum write SetNum; end;  Методы, входящие в состав интерфейса, можно реализовать как статические или как виртуальные. В случае с виртуальными методами, мы сможем переопределять эти методы в дочерних классах. Если же пользоваться статическими методами, то всё равно можно включить в дочерний класс новую реализацию этого метода. Для этого необходимо заново указать интерфейсный тип в подклассе. Оба подхода одинаково удобны, но для виртуальных методов потребуется больше памяти. Чтобы настроить точки входа интерфейсных функций, компилятор вставляет в исходный код программы заглушки, которые в конечном счёте обеспечивают передачу управления соответствующему методу класса, реализующего интерфейс. Заглушка для статического метода занимает в 4 раза меньше памяти чем для динамического.

Технические приемы, связанные с использованием интерфейсов

(делегирование, использование директивы implements) В Delphi можно делегировать реализацию интерфейса, поддерживаемого некоторым классом, объекту, входящему в состав этого класса. При этом, доступ к объекту осуществляется с использованием свойства, и т. о. можно сделать код реализации интерфейса частью нескольких, практически несвязанных между собой классов. Для реализации такого подхода используется специальная директива implements. TMyJumper = class (IInterfacedObject, IJumper)  private  fJumpImpl: IJumper;  public  constructor Create;  property Jumper: IJumper read fJumpImpl implements IJumper;  end;  Видно, что свойство ссылается на переменную интерфейсного типа, однако, на практике можно ссылаться на переменную, ссылающуюся на обычный объект.  Использование директивы implements позволяет делегировать реализацию метода интерфейса другим классам. Она всегда указывается последней в определении свойства, после неё можно указать не один, а целый ряд интерфейсов, отделяемых запятыми. Директива implements позволяет осуществить бесконфликтное объединение -  концепция COM, относящаяся к комбинации классов для выполнения одной задачи.  Ещё одно преимущество данной директивы состоит в том, что она позволяет отложить использование необходимых для реализации интерфейсов ресурсов до того момента, когда они станут действительно необходимы. Например, для реализации некоторого интерфейса требуется 1 мегабайт памяти для хранения растрового изображения, но интерфейс требуется пользователю редко. Неэффективно постоянно выделять метр памяти, который будет использоваться время от времени. Директива implements позволяет реализовать интерфейс в отдельном классе и создавать экземпляр по мере необходимости.  TJumperImpl = class(TAggregatedObject, IJumper)  private  Pos: integer;  public  function Jump: string;  function Walk: String;  procedure SetPos (Value: integer);  function GetPos: integer;  end;  Здесь используется TAggregatedObject для того, чтобы не было некорректной работы счётчика ссылок.



Исключительные ситуации

В Delphi исключения – это объекты, содержащие информацию, идентифицирующую ошибку и место её возникновения. В библиотеке RTL определен целый ряд исключений, относящихся к проблемам, возникающим в процессе выполнения программ, а так же к проблемам ресурсов Windows. Например, нехватке памяти, или ошибкам компонентов, использование неправильного индекса и т. п. Программист может создавать собственные исключения, производя новый подкласс от стандартного класса-исключения или одного из его потомков. Например. type EArrayFull = class (Exception) В примере при добавлении новых элементов в массив, который уже заполнен, можно породить соответствующую исключительную ситуацию, создав объект данного класса: …  if MyArray. Full then raise EArrayFull. Create (‘Массив полон’);  …  У метода Create, наследуемого от класса Exception, есть строковый параметр, описывающий пользователю исключительную ситуацию.  Программисту не надо заботится об уничтожении объекта, созданного для обработки исключения – его удаление производится автоматически механизмом обработки исключений.  В программе можно использовать любое количество обработчиков после одного и того же блока try. В этом случае они будут выполняться последовательно один за другим. Поэтому, обработчики более широкого назначения (т. е. обработчики классов, являющихся родителями по отношению к другим классам, необходимо размещать ближе к концу этой последовательности, т. е. т. к. существует иерархия классов исключений, обработчик будет вызван и для подклассов, связанных с ним типов данных).  Обработка исключений.  Идея исключений состоит в том, чтобы сделать программу более надёжной, позволяя обрабатывать программные и аппаратные ошибки простым единообразным способом. Программа при этом может сохранить работоспособность или завершить работу корректно, позволяя пользователю сохранить все данные перед выходом. Технология обработки ошибок позволяет отделить код обработки ошибок от смыслового кода, не смешивая их в единое целое. Кроме того, исключения определяют универсальный и стандартный механизм сообщения об ошибках, используемый так же компонентами Delphi.  Try, except, finally, raise.  try помечает начала защищённого участка кода.  except обозначает конец защищённого участка кода и начало операторов обработки исключения. Синтаксис следующий: on ТипИсключения do.  finally специфицирует код, который выполнится в любом случае, даже если произошло исключение. В рамках фрагмента кода, помеченного этим ключевым словом, как правило выполняются разного рода завершающие операции.  raise позволяет породить исключительную ситуацию. Большинство исключений, с которыми программист сталкивается, в Delphi генерируются системой, но можно самостоятельно породить исключение в программе, когда на этапе выполнения программы вдруг обнаружится некорректность или противоречивость данных. Ключевое слово raise можно так же использовать внутри обработчика исключений, чтобы породить исключения заново. Это может потребоваться для того, чтобы передать исключение следующему обработчику.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6