Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ "Классы". что это и как используется?

Автор: Altair 11.06.2004 20:23

Я часто слышу такое понятие, как "классы", например -

Цитата
при использовании классов в паскале ...

Но нигде не говорится, что это такое.
Что-же это такое и с чем их едят?

Автор: BlackShadow 11.06.2004 20:53

Классы - следующее поколение объектов.
Пример описания:

Код

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 11.06.2004 21:17

Классы, по сути - те же объекты.

Автор: Altair 11.06.2004 21:31

Супер. Спасибо, romtek.
Я оценил классы.

Автор: P@sh@ 25.06.2004 19:38

еще добавлю, что класс по умолчанию всегда наследуется от TObject, т.е. у него сразу есть несколько полезных методов (правда я ни разу ими не пользовался). так что если хочешь создать собственный объект полностью с нуля, используй лучше object (если конечно не компонент пишешь)

PS: какое отношение имеет перегрузка к классам ? unsure.gif

Автор: BlackShadow 25.06.2004 20:02

А ты с Reintroduced сталкивался?
Вот такое и имеет.

А ещё надо добавить, что экземпляры классов - они всегда динамические.