(Часть 3 статьи «Объектно-ориентированные мысли — разговоры о разработке Delphi»)
В первых двух статьях обсуждались темы, связанные с инкапсуляцией. Здесь я хочу поговорить с вами о наследовании и полиморфизме.
Наследование и полиморфизм тесно связаны. Object Pascal представляет полиморфный механизм, называемый перегрузкой. Его идея имеет мало общего с объектно-ориентированным и не будет обсуждаться здесь. Полиморфизм, тесно связанный с объектно-ориентированным мышлением, — это то, на чем мы фокусируемся.
Полиморфизм опирается на концепции абстрактных и виртуальных методов, а также тесно связан с наследованием. Считается, что мы часто определяем некоторые базовые объекты, а затем определяем некоторые из их реализаций как абстрактные, что означает, что мы определяем только интерфейс, не определяя конкретных деталей реализации. Следуя этой идее, мы также определим несколько производных (унаследованных) объектов, в которых фактически реализованы детали, которые не были реализованы в классе-предке. Это делает базовый класс, который мы определили ранее, полиморфным. Преимущество этого механизма в том, что когда мы используем эти классы, нам нужен только один набор кода для выполнения нескольких функций. Единственное, что необходимо изменить, — это часть, создающая экземпляр объекта.
Обратите внимание на такой класс:
TStream = класс (TObject)
…
общественный
функция Read(var Buffer; Count: Longint): Longint virtual;
функция Write(const Buffer; Count: Longint): Longint virtual;
…
конец;
Виртуальные и абстрактные зарезервированные слова указывают на то, что методы Read и Write являются чисто виртуальными функциями. Это показывает, что класс TStream на самом деле использовать нельзя (экземпляры этого класса не могут быть созданы). Это просто класс, похожий на интерфейс, который определяет основные функции, которые класс TStream должен иметь и которые должен обрабатывать. А также оговаривается, что другие классы, производные от класса TStream, должны реализовывать функции (такие как чтение и запись и т. д.).
Например, TFileStream реализует класс TStream в форме приложений дискового файла, а TMemoryStream реализует класс TStream в форме приложений памяти; Теперь предположим, что существует класс TMyClass, предоставляющий метод SaveToStream:
TMyClass = Класс (TObject)
PROcedure SaveToStream (поток: TStream);
конец;
Тогда, применив идею полиморфизма, можно получить такой код:
вар
стрм: TStream;
МойКласс: ТМиКласс;
начинать
strm := TFileStream.Create('abc.txt'); // ß Реальный тип экземпляра Stream здесь — TFileStream
МойКласс := TMyClass.Create;
MyClass.SaveToStream(стрм);
…..
конец;
Чтобы сохранить содержимое MyClass в памяти, просто измените
strm := TFileStream.Create('abc.txt');
для:
стрм:= TMemoryStream.Create;
Вот и все.
Использование полиморфизма требует двух аспектов работы. Один, конечно, заключается в том, что полиморфизм учитывается в структуре классов и может предоставлять промежуточные классы (абстрактные классы), реализующие определенные функции. Классы Эта работа отражается на определении некоторых процедур и параметров функций.
Еще один очень важный момент, я хотел бы напомнить всем, что планирование классов очень важно. В эпоху объектно-ориентированного программирования структура классов во многом определяет структуру программы и определяет успех или неудачу разработки программного обеспечения. Четкая иерархическая архитектура классов не только облегчает функциональное разделение и расширение, но также упрощает обслуживание кода. Среди них более предпочтительным методом является применение идей наследования и полиморфизма, введение абстрактных классов и введение промежуточных классов.
Ниже перечислены некоторые абстрактные и конкретные классы, представленные в Delphi:
конкретный класс, производный от абстрактного класса
TStream TFileStream, TMemoryStream;
TCustomIniFile TIniFile, TMemIniFile, TRegistryIniFile;
TStrings TStringList, TMemoStrings, TListBoxStrings;
Есть еще много других, которые ждут, пока мы с вами их обнаружим. Наиболее часто используемый здесь — TStream, и больше всего меня удивляет TCustomIniFile. Его TRegistryIniFile позволяет получить доступ к реестру так же, как IniFile! Это позволяет мне использовать набор кодов для реализации функций записи реестра и записи Ini-файлов. Хотя используемая технология проста, ее значение необычайно!
(Незакончено, продолжение следует)
Еще статьи