ООП, Обьекты и Классы

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ООП, Обьекты и Классы

Сообщение compiler » 08.07.2007 15:12:48

Добрый день, начал изучать ООП, сначала по различным статьям, потом по руководству FPC, столкнулся с некоторыми вопросами о различии обьектов и классов, но пойдем по порядку...
Как я сначала понимал это различие, сначала на примере...
integer -- это класс, а после объявления var i:integer;, i - становится обьектом класса integer, и может рассматриваться как указатель на запись которая находится где-то...
Тоесть люди -- класс, а Вася Пупкин -- обьект. Таким образом разница между классами и обьектами ставится ясной, НО что мы читаем в руководстве
A class can be seen as a pointer to an object, or a pointer to a record.
и
The real difference between objects and classes is in the way they are created
(Reference guide. Chapter 6 , 6.1) :shock:
Так в чем же разница?
compiler
новенький
 
Сообщения: 39
Зарегистрирован: 20.02.2007 13:49:12

Сообщение shade » 08.07.2007 17:27:39

Эта путаница из-за совместимости и Tubro Pascal и Object Pascal

Сначала были объекты определяемые с помощью ключевого слова object - их можно сравнить с записями для которых определены специальные процедуры - методы

Потом появились классы - теже объекты, но экземпляр класса всегда располагается в динамической памяти, и в этом смысле его можно сравнить с указателем на объект (object).

Чтобы не путаться, в паскале следует под классом и объектом понимать тип, значение (не путать с переменной) обзывать экземпляром (instance)...

Пример на класс
определение переменой типа TObject (класс)
obj: TObject;

создание экземпляра класса TObject
obj := TObject.Create;

удаляем объект
obj.Free;

пример на объект

type
TMyObj = object
procedure sayhello;
end;

// описываем метод объекта
procedure TMyObj.sayhello;
begin
writeln('Hello world');
end;

var
// определяем переменную объекта (создавать не надо, но для использования
// виртуальных функций нужно вызвать конструктор
obj: TMyObj;

// вызываем метод
obj.sayhello;

PS: по объектам лучше почитать какую-нибудь книжку по Tubro Pascal
по классам - книжку по Delphi
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение compiler » 08.07.2007 17:55:52

shade писал(а):значение (не путать с переменной) обзывать экземпляром (instance)...
а чем переменная отличается от экземпляра?
compiler
новенький
 
Сообщения: 39
Зарегистрирован: 20.02.2007 13:49:12

Сообщение shade » 08.07.2007 19:39:50

compiler писал(а):а чем переменная отличается от экземпляра?

Тем, что в переменной может храниться экземпляр, а может и nil...

В общем
переменная -- это ящик
экземпляр -- это вешь, которую можно положить в ящик
nil -- это пустая вещь :lol:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение compiler » 08.07.2007 20:24:17

огромнейшее спасибо, но
shade писал(а):Тем, что в переменной может храниться экземпляр, а может и nil...
а как в переменную поместить nil?
compiler
новенький
 
Сообщения: 39
Зарегистрирован: 20.02.2007 13:49:12

Re: ООП, Обьекты и Классы

Сообщение v-t-l » 08.07.2007 21:49:57

compiler писал(а):integer -- это класс, а после объявления var i:integer;, i - становится обьектом класса integer, и может рассматриваться как указатель на запись которая находится где-то...


Неудачный пример. integer -- это не класс, а один из простейших типов, т.к. не имеет полей, свойств, методов.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение shade » 08.07.2007 22:01:23

compiler писал(а):а как в переменную поместить nil?

мда...
obj := nil; // это применимо только для классов, конечно же
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение v-t-l » 08.07.2007 22:05:17

shade писал(а):Тем, что в переменной может храниться экземпляр, а может и nil...

В общем
переменная -- это ящик
экземпляр -- это вешь, которую можно положить в ящик
nil -- это пустая вещь :lol:


В переменной (объектного типа, класса) храниться не экземпляр, а адрес (указатель) экземпляра в памяти.

Соответственно, присвоив такой переменной nil, мы не высвобождаем память, занимаемую экземпляром класса, а просто теряем его адрес.
Поэтому, экземпляры объектов/классов нужно уничтожать, вызывая его метод-деструктор (обычно Free), а потом уже можно переменной присвоить nil, если нужно.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l » 08.07.2007 22:17:01

И поэтому-же, объявляя переменную класса, мы не получаем сразу экземпляр объекта, а только после вызова конструктора (обычно Create), который создает экземпляр объекта (класса) и возвращает указатель на него (его адрес).
Так что, рекомендую compiler ознакомиться и с указателями (pointers).
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение Yogrik » 08.07.2007 22:33:51

v-t-l писал(а):Поэтому, экземпляры объектов/классов нужно уничтожать, вызывая его метод-деструктор (обычно Free), а потом уже можно переменной присвоить nil, если нужно.

Читать как:
Поэтому, экземпляры объектов/классов нужно уничтожать, вызывая его метод-деструктор (обычно Destroy), а потом уже можно переменной присвоить nil, если нужно.

Однако часто вместо деструктора вызывают метод Free, который сначало проверяет не равна ли ссылка Nil а потом вызывает метод-деструктор(Destorоy)...

А те кто уже постарше обычно пользуются FreeAndNil(obj), который после вызова Free присваивает переменной Nil
Yogrik
постоялец
 
Сообщения: 116
Зарегистрирован: 23.03.2006 00:41:48

Сообщение v-t-l » 08.07.2007 22:44:35

Yogrik писал(а):А те кто уже постарше обычно пользуются FreeAndNil(obj), который после вызова Free присваивает переменной Nil


lazarus.pp:
Код: Выделить всё
...
  // free the IDE, so everything is freed before the finalization sections
  MainIDE.Free;
  MainIDE:=nil;
end.
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение zub » 08.07.2007 22:47:18

>>В переменной (объектного типа, класса) храниться не экземпляр, а адрес (указатель) экземпляра в памяти.
ненадо путать автора, в пересенной объектного типа хранится экземпляр а не указатель как в переменной классового типа
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Сообщение shade » 08.07.2007 23:08:03

v-t-l писал(а):Соответственно, присвоив такой переменной nil, мы не высвобождаем память, занимаемую экземпляром класса, а просто теряем его адрес.

На один экземпляр класса может ссылаться несколько переменных, поэтому не нужно удалять объект только ради того, чтобы одной из переменных присвоить nil :wink:
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение v-t-l » 08.07.2007 23:10:42

zub писал(а):>>В переменной (объектного типа, класса) храниться не экземпляр, а адрес (указатель) экземпляра в памяти.
ненадо путать автора, в пересенной объектного типа хранится экземпляр а не указатель как в переменной классового типа

то есть
Код: Выделить всё
var obj1, obj2: TObject;
...
obj1 := TObject.Create;
obj2 := obj1;


obj1 и obj2 будут разные экземпляры?
v-t-l
энтузиаст
 
Сообщения: 740
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение zub » 08.07.2007 23:14:07

TObject вообщето класс а не объект. я имел ввиду ключевое слово OBJECT
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru