Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ООП - помогите разобраться. [D7]


Страницы:   1 2

parovoZZ ©   (2006-06-30 03:11:00) 

Здарова

Вот никак не могу разобраться в этом лесу.
В исходниках вижу

MyClass.Ceate;
и
MyClass := TMyClass.Create;

В чём разница?


DrPass   (2006-07-09 22:08:00) [21]


> tesseract ©   (09.07.06 21:33) [17]

Лучше не связывайся


Пусик   (2006-07-09 21:48:00) [22]

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

Но существуют и другие объекты, управление которыми не требуется дополнительно. Пару примеров ты видел.


Пусик   (2006-07-09 21:43:00) [23]


> tesseract ©   (09.07.06 21:33) [17]
> > Разве кто-то запрещает в полях объекта хранить любую информацию?
> Храни, что хочешь, но к вопросу это не относиться.


Это почему это не относится?
--------------------

Хочу также заметить, что вот это

> tesseract ©   (09.07.06 21:26) [15]
> > А чем они отличаются?Наверно тем что объект ссылки на
> подчинённые не хранит,


имеет явный запах сказки.

Вот на это


> tesseract ©   (09.07.06 12:08) [10]
> Creatе - функция создаёт экземпляр класса и возвращает его
> ссылку. Если ты не укажешь переменную, то класс "повиснет"
> в памяти - его нельзя будет использовать или освободить
> "вручную"


тебе приведено 2 примера, прекрасно дополняющих твой ответ.
Имей силы принять поправки и не спорить против очевидного.


tesseract   (2006-07-09 21:33:00) [24]

> Разве кто-то запрещает в полях объекта хранить любую информацию?


Храни, что хочешь, но к вопросу это не относиться.


Пусик   (2006-07-09 21:31:00) [25]


> Наверно тем что объект ссылки на подчинённые не хранит,


Разве кто-то запрещает в полях объекта хранить любуюинформацию?


tesseract   (2006-07-09 21:26:00) [26]

> А чем они отличаются?

Наверно тем что объект ссылки на подчинённые не хранит,
именно это ты и делаешь - записываешь ссылку на компонет. Который освободиться при уничтожении объека родителя.
Вопрос был про ООП, а не VCL.


Пусик   (2006-07-09 19:25:00) [27]


> Только слабо так-же, но не для компонента? А для объекта?


А чем они отличаются?


> ЗЫ: не парьте человеку мозги.


Не надо выдавать знания порциями. Не твои это функции.


tesseract   (2006-07-09 19:01:00) [28]

> [11] Пусик ©   (09.07.06 18:22)
>
> > tesseract ©   (09.07.06 12:08) [10]
> >Если ты не укажешь переменную, то класс "повиснет"
> > в памяти - его нельзя будет использовать или освободить
>
> > "вручную".
>
>
> Необязательно. Вот пара примеров:
>
> type
> TThr=class(TThread)
>   procedure Execute; override;
> end;
>
> procedure TThr.Execute;
> begin
> FreeOnTerminate := True;
> end;
>
>
> Вызываем - TThr.Create;
>
> Второй пример:
>
> type
>
> TMyObj=class;
>
> TMyLabel=class(TLabel)
> private
>   FObj: TObject;
> public
>   constructor CreateLabel(aOwner: TComponent; aParent:
> TWinControl;aObj: TMyObj);
>   destructor Destroy; override;
> end;
>
> TMyObj=class
> public
>   constructor Create(aOwner: TComponent; aParent: TWinControl)
> ;
>   destructor Destroy; override;
> end;
>
> { TMyObj }
>
> constructor TMyObj.Create(aOwner: TComponent; aParent: TWinControl)
> ;
> begin
> if aOwner=nil then raise Exception.Create('Set Owner component')
> ;
> TMyLabel.CreateLabel(aOwner,aParent,Self);
> end;
>
> destructor TMyObj.Destroy;
> begin
> MessageBox(Application.Handle,'Однако, меня кто-то уничтожил!
> ','Хм...!',MB_OK);
> inherited;
> end;
>
> { TMyLabel }
>
> constructor TMyLabel.CreateLabel(aOwner: TComponent; aParent:
> TWinControl;aObj: TMyObj);
> begin
> inherited Create(aOwner);
> FObj := aObj;
> Top := 100;
> Left := 100;
> Height := 200;
> Caption := 'test label';
> Width := 100;
> Parent := aParent;
> end;
>
> destructor TMyLabel.Destroy;
> begin
> FObj.Free;
> inherited;
> end;
>
> Вызываем -
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> TMyObj.Create(Form1,Form1);
> end;


Пусик про owner/parent мне прекрасно известно. Только слабо так-же, но не для компонента? А для объекта?

ЗЫ: не парьте человеку мозги.


Leonid Troyanovsky   (2006-07-09 18:51:00) [29]


> Пусик ©   (09.07.06 18:22) [11]

> Второй пример:


Мутный какой-то пример.
Вот, если б,  было что-то вроде TWinControl.Parent,
тогда б, было значительно ясней.

Ну, или, на худой конец, Notification.

--
Regards, LVT.


Пусик   (2006-07-09 18:22:00) [30]


> tesseract ©   (09.07.06 12:08) [10]
>Если ты не укажешь переменную, то класс "повиснет"
> в памяти - его нельзя будет использовать или освободить
> "вручную".


Необязательно. Вот пара примеров:

type
 TThr=class(TThread)
   procedure Execute; override;
 end;

procedure TThr.Execute;
begin
 FreeOnTerminate := True;
end;


Вызываем - TThr.Create;

Второй пример:

type

 TMyObj=class;

 TMyLabel=class(TLabel)
 private
   FObj: TObject;
 public
   constructor CreateLabel(aOwner: TComponent; aParent: TWinControl;aObj: TMyObj);
   destructor Destroy; override;
 end;

 TMyObj=class
 public
   constructor Create(aOwner: TComponent; aParent: TWinControl);
   destructor Destroy; override;
 end;

{ TMyObj }

constructor TMyObj.Create(aOwner: TComponent; aParent: TWinControl);
begin
 if aOwner=nil then raise Exception.Create('Set Owner component');
 TMyLabel.CreateLabel(aOwner,aParent,Self);
end;

destructor TMyObj.Destroy;
begin
 MessageBox(Application.Handle,'Однако, меня кто-то уничтожил!','Хм...!',MB_OK);
 inherited;
end;

{ TMyLabel }

constructor TMyLabel.CreateLabel(aOwner: TComponent; aParent: TWinControl;aObj: TMyObj);
begin
 inherited Create(aOwner);
 FObj := aObj;
 Top := 100;
 Left := 100;
 Height := 200;
 Caption := 'test label';
 Width := 100;
 Parent := aParent;
end;

destructor TMyLabel.Destroy;
begin
 FObj.Free;
 inherited;
end;


Вызываем -

procedure TForm1.Button2Click(Sender: TObject);
begin
 TMyObj.Create(Form1,Form1);
end;


tesseract   (2006-07-09 12:08:00) [31]

Creatе - функция создаёт экземпляр класса и возвращает его ссылку.
Если ты не укажешь переменную, то класс "повиснет" в памяти - его нельзя будет использовать или освободить "вручную".

with TResourceStream.Create(HInst, ResName, RT_RCDATA) do


В данном случае создаётся "невидимая" переменная и с ней выполняются действия через with, в конечном счёте класс освободиться в finally.

Free от destroy отличается тем, что Free сначала проверяет, существует ли класс.

я предпочитаю FreeAndNil.


Шпиён   (2006-07-08 22:44:00) [32]

Упс...sorry. Был не внимателен. Не заметил, что MyClass.Create, а не TMyClass.Create


Шпиён   (2006-07-08 22:24:00) [33]


> Джо ©   (30.06.06 03:21) [1]
> > В исходниках вижу
> >
> > MyClass.Ceate;
>
> Показывай.

А то не видел никогда -)

with TResourceStream.Create(HInst, ResName, RT_RCDATA) do
 try
   Instance := ReadComponent(Instance);
 finally
   Free;
 end;

(c) classes.pas


PSPF2003   (2006-07-08 22:02:00) [34]


> А чем отличается destroy от free? В справке написано, что
> при уничтожении объекта следует вызывать Free, а не destroy.
>

Читал видно через строчку:)


Virgo_Style   (2006-07-08 21:55:00) [35]

parovoZZ ©   (08.07.06 21:49) [5]
там же написано, что Free automatically calls the destructor if the object reference is not nil.


parovoZZ   (2006-07-08 21:49:00) [36]

А чем отличается destroy от free? В справке написано, что при уничтожении объекта следует вызывать Free, а не destroy.


Германн   (2006-06-30 03:49:00) [37]


> Не мне говорить, но Create-таки это конструктор, а не обычный
> метод, даже, я бы сказал, отчасти class function. Вот и
> хотелось бы взглянуть на сей дивный исходник — какая такая
> нужда заставила его вызывать у экз. класса. :)Если, конечно,
>  он и на самом деле не называется (как в оригинале) Ceate
> :)

Лично мне глядеть уже ни на что не хочется! И время не подходящее и обстоятельства. Но метод Create, как конструктор, имеет исторически две функции - 1. создать и 2. инициализировать. Как метод класса он выполняет и то и другое. Как метод объекта(экземпляра класса) он выполняет только второе.

А вопрос то "В чём разница?". А не в конкретном коде!


Джо   (2006-06-30 03:30:00) [38]

> В первом выполняется метод Create уже созданного ранее объекта
> TMyClass .

Не мне говорить, но Create-таки это конструктор, а не обычный метод, даже, я бы сказал, отчасти class function. Вот и хотелось бы взглянуть на сей дивный исходник — какая такая нужда заставила его вызывать у экз. класса. :)
Если, конечно, он и на самом деле не называется (как в оригинале) Ceate:)


Германн   (2006-06-30 03:25:00) [39]


> MyClass.Ceate;
и
MyClass := TMyClass.Create;


Во втором случае создаётся новый экземпляр(объект) класса TMyClass и выполняется его метод Create.
В первом выполняется метод Create уже созданного ранее объекта TMyClass .


Джо   (2006-06-30 03:21:00) [40]

> В исходниках вижу
>
> MyClass.Ceate;

Показывай.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо