![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ООП - помогите разобраться. [D7]
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;
Показывай.