Помощь - Поиск - Пользователи - Календарь
Полная версия: "Классы". что это и как используется?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Altair
Я часто слышу такое понятие, как "классы", например -
Цитата
при использовании классов в паскале ...

Но нигде не говорится, что это такое.
Что-же это такое и с чем их едят?
BlackShadow
Классы - следующее поколение объектов.
Пример описания:
Код

Type
 TMyClass=Class
 Private
   FMyProperty:Integer;
   Procedure SetMyProperty(Value:Integer);
 Public
   Constructor Create;

   Property MyProperty:Integer Read FMyProperty Writer SetMyProperty;
 End;

Procedure TMyClass.SetMyProperty(Value:Integer);
Begin
 If Value In [0..9] Then
   FMyProperty:=Value
End;

Contructor TMyClass.Create;
Begin
 FMyProperty:=0
End;


Ну, это самый примитив. Как видишь, тут описывается класс, в котором есть конструктор и одно свойство. При попытке считать его возвращается значение приватного поля, а при попытки записи - вызывается такая же процедура. Т. е. код
Код

Var
 a:TMyClass;
Begin
 a:=TMyClass.Create;
 a.MyProperty:=23;
 WriterLn(a.MyProperty)
End.

Выведет на экран 0.

Едем дальше. Классы ещё умеют такую фишку как свойства - индексы. Например:
Код

Type
 TMyClass=Class
 Private
   FData:Array[0..2] Of Integer;
   Function GetData(Index:Integer):Integer;
   Procedure SetData(Index:Integer;Value:Integer);
 Public
   Contructor Create;

   Property Data[Index:Integer]:Integer Read GetData Writer SetData;Default;
 End;

Function TMyClass.GetData(Index:Integer):Integer;
Begin
 If Index In [0..2] Then
   Result:=FData[Index]
 Else
   Result:=-1
End;

Procedure TMyClass.SetData(Index:Integer;Value:Integer);
Begin
 If Index In [0..2] Then
   FData[Index]:=Value
End;

Contructor TMyClass.Create;
Var
 i:Integer;
Begin
 For i:=0 To 2 Do
   FData[i]:=0
End;


Тут описывается конструктор и индексируемое свойство. Я для простоты демонстрации взял индексирование по Integer, а ведь можно и по String smile.gif и т. д. Как работает думаю, что понятно. Есть ещё одна деталь: словечко затесалось в объявлении свойства - Default. Очень удобное, надо сказать, словечко. Оно говорит о том, что встретив надпись InstanceOfTMyClass[x], её можно расценивать как InstanceOfMyClass.Data[x]. Пример:
Код

Var
 a:TMyClass;
 i:Integer;
Begin
 a:=TMyClass.Create;
 For i:=0 To 2 Do
   a[i]:=2-i;
 For i:=0 To 3 Do
   WriterLn(a[i])
End.

На экран выведет
2
1
0
-1 - как результат обращения к несуществующему элементу.

Продолжим ликбез.
Есть ещё такая фишка в Object Pascal как OverLoad. Т. е. то, что есть в крови у C, а нету у Pascal. Это когда функция с одним именем, но с разными параметрами. Например:
Код

Function Abs(x:Real):Real;OverLoad;
Begin
 If x<0 Then
   Result:=-1
 Else
   Result:=x
End;

Function Abs(x:Integer):Integer;OverLoad;
Begin
 If x<0 Then
   Result:=-1
 Else
   Result:=x
End;

Приер туповат, но верен smile.gif

Вот. Это то, что касается классов в Object Pascal. А ещё надо отметить, что ВСЕ экземпляры классов размещаются в куче. Т. е. переменные a из примеров по сути указатели на экземпляры классов. А так, всё что было (наследование, полиформизм) и т. д. всё осталось.
Забыл ещё сказать, что кроме Private и Public появилось ещё Protected. Это когда сам видишь, дети твои видят, а от внешнего мира спрятано. Как-то странно прозвучало smile.gif

Всё Delphi для большинства по сути и есть кучка классов из VCL.
Romtek
Классы, по сути - те же объекты.
Altair
Супер. Спасибо, romtek.
Я оценил классы.
P@sh@
еще добавлю, что класс по умолчанию всегда наследуется от TObject, т.е. у него сразу есть несколько полезных методов (правда я ни разу ими не пользовался). так что если хочешь создать собственный объект полностью с нуля, используй лучше object (если конечно не компонент пишешь)

PS: какое отношение имеет перегрузка к классам ? unsure.gif
BlackShadow
А ты с Reintroduced сталкивался?
Вот такое и имеет.

А ещё надо добавить, что экземпляры классов - они всегда динамические.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.