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

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

Корректное "не создание" класса


learner ©   (2006-06-15 21:00:00) 

Подскажите, пожалуйста, как корректно не создать класс
и как подчистить за собой ?
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-16 20:38:00) [1]


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

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


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


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


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

--
Regards, LVT.


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


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


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

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

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


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


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

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


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

--
Regards, LVT.


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


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


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

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

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

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


Leonid Troyanovsky   (2006-06-16 20:04:00) [5]


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

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



В [7]

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

[1], [2].

--
Regards, LVT.


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


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


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


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


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


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

--
Regards, LVT.


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

 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;


Desdechado   (2006-06-16 13:39:00) [9]

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


learner   (2006-06-16 01:28:00) [10]

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


Джо   (2006-06-15 23:30:00) [11]

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

Это вряд ли.


Desdechado   (2006-06-15 22:59:00) [12]

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


Loginov Dmitry   (2006-06-15 21:34:00) [13]

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


Leonid Troyanovsky   (2006-06-15 21:26:00) [14]


> learner ©   (15.06.06 21:00)  

> if TestMyConditions then inherited Create(AOwner);



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


--
Regards, LVT.


Наверх

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