Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Вниз

Корректное "не создание" класса   Найти похожие ветки 

 
learner ©   (2006-06-15 21:00) [0]

Подскажите, пожалуйста, как корректно не создать класс
и как подчистить за собой ?
type
TMyClass=class (TSomeClass)
 private
 public
  constructor Create(AOwner: TComponent); override;
 published
 end;

implementation

constructor TMyClass.Create(AOwner: TSomeClass);
begin
if TestMyConditions then inherited Create(AOwner);
end;

procedure Test;
var
MyClass:TMyClass;
begin
MyClass:=TMyClass.Create(nil);
// Как узнать, что объект не создан и
end;


 
Leonid Troyanovsky ©   (2006-06-15 21:26) [1]


> learner ©   (15.06.06 21:00)  

> if TestMyConditions then inherited Create(AOwner);



 if not TestMyConditions then
   raise EMyException.Create(..);
 inherited;


--
Regards, LVT.


 
Loginov Dmitry ©   (2006-06-15 21:34) [2]

procedure Test;
var
 MyClass:TMyClass;
begin
 if not TestMyConditions then
   MyClass:=TMyClass.Create(nil);
end;


 
Desdechado ©   (2006-06-15 22:59) [3]

if( myvar=nil ) then Не создан


 
Джо ©   (2006-06-15 23:30) [4]

> [3] Desdechado ©   (15.06.06 22:59)
> if( myvar=nil ) then Не создан

Это вряд ли.


 
learner ©   (2006-06-16 01:28) [5]

Спасибо всем !


 
Desdechado ©   (2006-06-16 13:39) [6]

Джо ©   (15.06.06 23:30) [4]
Почему?
Если не создался, то переменная (если была nil) будет nil.
Понятно, что исключения скорее всего будут при несоздании. Но ведь их можно обработать, а код можно и дальше заставить работать даже при несозданном объекте (если этот код не использует этот объект).


 
Пусик ©   (2006-06-16 19:45) [7]

 TMyClass=class
 public
   class function CreateMyClass(Value: Boolean): TMyClass;
 end;

{ TMyClass }

class function TMyClass.CreateMyClass(Value: Boolean): TMyClass;
begin
 Result := nil;
 if Value then Result := TMyClass.Create;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 Obj: TMyClass;
begin
 Obj := TMyClass.CreateMyClass(False);
 if Assigned(Obj) then Obj.Free;
end;


 
Leonid Troyanovsky ©   (2006-06-16 20:00) [8]


> Пусик ©   (16.06.06 19:45) [7]


Вот, скажи мне, любезный Пусик, к чему столь
приумножать сущности?

--
Regards, LVT.


 
Пусик ©   (2006-06-16 20:02) [9]


> Leonid Troyanovsky ©   (16.06.06 20:00) [8]
>
>
> > Пусик ©   (16.06.06 19:45) [7]
>
>
> Вот, скажи мне, любезный Пусик, к чему столь
> приумножать сущности?
>
> --
> Regards, LVT.


А где сущности приумножены?
И в котором постинге есть пример без приумножения?


 
Leonid Troyanovsky ©   (2006-06-16 20:04) [10]


> Пусик ©   (16.06.06 20:02) [9]

> А где сущности приумножены?



В [7]

> И в котором постинге есть пример без приумножения?

[1], [2].

--
Regards, LVT.


 
Пусик ©   (2006-06-16 20:08) [11]


> Leonid Troyanovsky ©   (16.06.06 20:04) [10]


Что касается [1].

Поднять исключение - это не лишняя сущность? Вообще-то исключение - довольно медлительная операция.

Что касается [2].

Почти тот же вид, только сбоку.
Лучше самому классу отдать на откуп, создаваться ему или нет, вместо того, чтобы использовать для этого отдельную функцию.
Пусть лучше класс будет самодостаточным. Или это не так?
Если не так, тогда в чем тут соль?


 
Leonid Troyanovsky ©   (2006-06-16 20:20) [12]


> Пусик ©   (16.06.06 20:08) [11]

> Поднять исключение - это не лишняя сущность? Вообще-то исключение
> - довольно медлительная операция.


А куда спешить? :)
А насчет лишнего - вроде, ничего нет.
Бо, в соответствии с ТЗ:
- сообщит, что объект не создан
- приведет к вызову деструктора, который и уничжтожит то,
что требуется уничтожать.

--
Regards, LVT.


 
Пусик ©   (2006-06-16 20:26) [13]


> Leonid Troyanovsky ©   (16.06.06 20:20) [12]
>
>
> > Пусик ©   (16.06.06 20:08) [11]
>
> > Поднять исключение - это не лишняя сущность? Вообще-то
> исключение
> > - довольно медлительная операция.
>
>
> А куда спешить? :)


Вообще, создание класса может занимать достаточное время(родительский - при inherited). Это тоже надо учитывать.
Кроме того, объекты могут создаваться множество раз, и в этом случае зачем лишний раз замедлять свою программу. Я считаю, что здесь не всегда оправдано использование исключений.

По поводу того, что деструктор уничтожит.

А зачем уничтожать, если можно не создавать? Это не лишняя сущность?


 
Leonid Troyanovsky ©   (2006-06-16 20:38) [14]


> Пусик ©   (16.06.06 20:26) [13]

> Вообще, создание класса может занимать достаточное время(родительский
> - при inherited). Это тоже надо учитывать.


Вообще-то, исключение - это, все же, исключение.
Ну, а место для inherited зависит от.


> А зачем уничтожать, если можно не создавать? Это не лишняя
> сущность?


В момент поднятия исключения в конструкторе может быть
уже создано нечто необходимое объекту.
Ну, а деструктор - это правильное место для уничтожения оного.

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
6-1141366408
DelphiN!
2006-03-03 09:13
2006.07.09
Перехват трафика


8-1134755959
hgd
2005-12-16 20:59
2006.07.09
Вывод большого изображения (Gb)


15-1149967652
VirEx
2006-06-10 23:27
2006.07.09
J2ME документация на русском, где достать?


2-1151044171
Dilmo
2006-06-23 10:29
2006.07.09
работа с Access


15-1150035209
Любопытствующий
2006-06-11 18:13
2006.07.09
Денежные переводы: почтовый vs электронный





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский