Разместите нашу кнопку!

Новые статьи:

Programming articles

Создание сайтов на шаблонах

Множество вариантов работы с графикой на канве

Шифруем файл с помощью другого файла

Перехват API функций - Основы

Как сделать действительно хороший сайт

Создание почтового клиента в Delphi 7

Применение паскаля для решения геометрических задач

Управление windows с помощью Delphi

Создание wap сайта

Операционная система unix, термины и понятия

SQL враг или друг

Возникновение и первая редакция ОС UNIX

Оптимизация проекта в Delphi

Ресурсы, зачем нужны ресурсы

Термины программистов 20 века

Советы по созданию собственного сайта с нуля

Шифруем файл с помощью пароля

Фракталы - геометрия природы

Crypt - Delphi программа для шифрования

Рассылка, зачем она нужна и как ее организовать?

Учебник по C++ для начинающих программистов

Уроки для изучения ассемблера

Загадочный тип PCHAR

Средства по созданию сайтов

Операторы преобразования классов is и as

Borland Developer studio 2006. Всё в одном

Создание базы данных в Delphi, без сторонних БД


Software engineering articles



Class

Объявление класса в секции type

  1. type Name = {packed} class
       Definitions...
       {class function|procedure ...}
    end;
  2. type Name = class(BaseClass);
  3. type Name = class;
  4. type Name = {packed} class(BaseClass)
       Class definition...
    end;
  5. type Name = {packed} class(BaseClass {,Interfaces})
       Class definition...
    end;
  6. type MetaClassName = class of class type;

Описание:

     Ключевое слово Class - это центральная часть объектно-ориентированного кода. Оно начинает определение "класса" - объектного типа данных.

     Определение содержит так называемых "членов" - данные и методы (подпрограммы). Когда создается объект класса, он самостоятелен - вы можете получить доступ к данным и методам объекта независимо от любых других объектов. Он похож на запись Delphi, но с активными компонентами - методами.

     Эти элементы определены в определении класса. Элементы-методы реализованы в секции реализации модуля. Объявление класса имеет типичный вид:

type
   ИмяКласса = class(БазовыйКласс)
   private
      // определения данных/методов локальных для этого модуля
   protected
      // определения данных/методов локальных для этого модуля + для потомков
   public
     // определения данных/методов используемых всеми объектами этого класса
   published
      // доступные извне публичные объявления
end;

     При создании экземпляра объекта этого класса могут быть переданы параметры. Они передаются в методе-конструкторе класса. При этом вместо function или method используется слово constructor. Вы можете создать несколько конструкторов для разных наборов параметров. Это реализуется с использованием ключевого слова overload в конце определения конструктора.

     Обычно метод-конструктор называется Create.

     См. код для примера.

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

     Обычно метод-деструктор называется Destroy.

     Существуют несколько способов использования слова Class:

     1. Определение класса, основанном на TObject по умолчанию. Все классы должны быть основаны на другом классе, или по умолчанию на TObject, классе высшего уровня. TObject предоставляет простейшую функциональность - обычно вам приходится определять все данные и методы самому, не используя ни одного из TObject.

     Внутри определения класса, вы можете добавлять в качестве префикса к определениям функций или процедур с ключевое слово Class. Это позволяет методам быть вызванным из самого класса в дополнение к возможности вызова из экземпляра объекта этого класса. Так как класс - это не настоящий объект, то память под него не выделяется. Поэтому методы класса не должны обращаться ко внутренним данным класса.

     2. Определение класса основанное на заданном классе, но без дополнений или изменений. Вы получите новый класс, работающий идентично базовому(BaseClass).

     3. Опережающее объявление классов. Оно позволяет всем классам в модуле быть перечисленными в начале секции объявления типов. Это очень удобно.

     4. Определение класса, основанное на заданном классе. Как на 1 выше, но в можете задать, на каком классе будет основан ваш новый класс. Ваш класс будет смесью определений предка и локальных определений.

     5. Класс может содержать реализации внешних предопределенных интерфейсов.

     6. Ссылка на метакласс позволяет переменной быть использованной в качестве ссылки на класс, а не на объект.

Пример кода:

// Full Unit code.
// -----------------------------------------------------------
// You must store this code in a unit called Unit1 with a form
// called Form1 that has an OnCreate event called FormCreate.

unit Unit1;

interface

uses
   SysUtils, Forms, Dialogs;

type
   // Define the classes in this Unit at the very start for clarity
   TForm1 = Class; // This is a forward class definition

   TFruit = Class(TObject) // This is an actual class definition :
     // Internal class field definitions - only accessible in this unit
     private
       isRound : Boolean;
       length : single;
       width : single;
       diameter : single;
     // Fields and methods only accessible by this class and descendants
     protected
     // Externally accessible fields and methods
     public
       // 2 constructors - one for round fruit, the other long fruit
       constructor Create(diameter : single); overload;
       constructor Create(length : single; width : single); overload;
     // Externally accessible and inspectable fields and methods
     published
       // Note that properties must use different names to local defs
       property round : Boolean
         read isRound;
       property len : single
         read length;
       property wide : single
         read width;
       property diam : single
         read diameter;
   end; // End of the TFruit class definition

   // The actual TForm1 class is now defined
   TForm1 = Class(TForm)
     procedure FormCreate(Sender: TObject);
     procedure ShowFruit(fruit : TFruit);
   private
     // No local data
   public
     // Uses just the TForm ancestor class public definitions
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

// Create a round fruit object
constructor TFruit.Create(diameter: single);
begin
   // Indicate that we have a round fruit, and set its size
   isRound := true;
   self.diameter := diameter;
end;

// Create a long fruit object
constructor TFruit.Create(length, width: single);
begin
   // Indicate that we have a long fruit, and set its size
   isRound := false;
   self.length := length;
   self.width := width;
end;

// Form object - action taken when the form is created
procedure TForm1.FormCreate(Sender: TObject);
var
   apple, banana : TFruit;
begin
   // Let us create our fruit objects
   apple := TFruit.Create(3.5);
   banana := TFruit.Create(7.0, 1.75);

   // Show details about our fruits
   ShowFruit(apple);
   ShowFruit(banana);
end;

// Show what the characteristics of our fruit are
procedure TForm1.ShowFruit(fruit: TFruit);
begin
   if fruit.round
   then ShowMessage('We have a round fruit, with diam = '+
                                                   FloatToStr(fruit.diam))
   else
   begin
     ShowMessage('We have a long fruit');
     ShowMessage(' it has length = '+FloatToStr(fruit.len));
     ShowMessage(' it has width = '+FloatToStr(fruit.wide));
   end;
end;

end.

Результат выполнения:

We have a round fruit with diam = 3.5
We have a long fruit
it has a length = 7
it has a width = 1.75