Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизПроверка возможности создания объекта в конструкторе Найти похожие ветки
← →
APXi (2004-12-03 20:55) [0]Есть какой либо класс, в конструкторе проверяется возможность создавать экземпляр объекта, как прервать создание объекта в конструкторе?
← →
begin...end © (2004-12-03 21:03) [1]> APXi (03.12.04 20:55)
Т.е. Вы в конструкторе своего класса создаёте какой-то экземпляр другого класса, и хотите это создание прервать? Именно прервать - никак, насколько я знаю. А зачем это нужно?
← →
APXi (2004-12-03 21:09) [2]Нет в конструкторе проверяется возможность создания не другого объекта а именно самого себя.
← →
Alexander Panov © (2004-12-03 21:12) [3]APXi (03.12.04 20:55)
Есть какой либо класс, в конструкторе проверяется возможность создавать экземпляр объекта, как прервать создание объекта в конструкторе?type
TSimpleClass=class
public
constructor Create;
class function CreateMyObject(flag: Boolean): TSimpleClass;
end;
implementation
class function TSimpleClass.CreateMyObject(flag: Boolean): TSimpleClass;
begin
Result := nil;
if flag then Result := TSimpleClass.Create;
end;
← →
APXi (2004-12-03 21:15) [4]А если у меня от класса TSimpleClass наследуются еще 20 классов тогда как?
← →
Alexander Panov © (2004-12-03 21:17) [5]APXi (03.12.04 21:15) [4]
Ну так virtual для этого есть.
← →
Alexander Panov © (2004-12-03 21:18) [6]да, писал прямо здесь - опечатки могут быть...
← →
APXi (2004-12-03 21:18) [7]Надо будет что
class function CreateMyObject(flag: Boolean): TSimpleClass
перекрывать для каждоо наследника?
← →
Alexander Panov © (2004-12-03 21:24) [8]APXi (03.12.04 21:18) [7]
Приведи пример простейшего наследования их тех, что тебе нужны. Попробуем решить проблему.
← →
Alexander Panov © (2004-12-03 21:35) [9]{ TClass1 }
constructor TClass1.Create(param: Integer);
begin
inherited Create;
FParam := param;
end;
class function TClass1.CreateObj(param: Integer): TClass1;
begin
Result := nil;
if param=1 then Result := TClass1.Create(param);
end;
{ TClass2 }
class function TClass2.CreateObj(param: Integer): TClass1;
begin
Result := nil;
if param=2 then Result := TClass2.Create(param);
end;TClass1=class
private
FParam: Integer;
public
constructor Create(param: Integer); virtual;
class function CreateObj(param: Integer): TClass1; virtual;
end;
TClass2=class(TClass1)
public
class function CreateObj(param: Integer): TClass1; override;
end;
← →
APXi (2004-12-03 21:38) [10]
type
TForm2 = class(TForm)
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
end;
....
constructor TForm2.Create(AOwner: TComponent);
begin
inherited;
// Проверяется подключение к базе или еще что нибудь
// и если все нормально тогда форма создается иначе нет
end;
//=====================================================
TForm3 = class(TForm2)
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
end;
....
constructor TForm3.Create(AOwner: TComponent);
begin
// соответственно вызывается конструктор TForm2
// и базовая форма может создаться или нет
inherited;
end;
....
// дальше где нибудь пишу
tmpForm := TForm3.Create(nil);
// если форма не создалась тогда должно быть tmpForm = nil
← →
Alexander Panov © (2004-12-03 21:51) [11]Можно еще посоветовать вызывать Exception в конструкторе.
type
EFormCreateError=Exception;
TForm2 = class(TForm)
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
end;
....
constructor TForm2.Create(AOwner: TComponent);
begin
inherited;
// Проверяется подключение к базе или еще что нибудь
// и если все нормально тогда форма создается иначе нет
if <все ОК>
then Exit
else raise EFormCreateError.Create("Error");
end;
//=====================================================
TForm3 = class(TForm2)
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
end;
....
constructor TForm3.Create(AOwner: TComponent);
begin
// соответственно вызывается конструктор TForm2
// и базовая форма может создаться или нет
try
inherited;
except
raise;
end;
end;
....
// дальше где нибудь пишу
try
tmpForm := TForm3.Create(nil);
except
Обработка ошибки...
end;
// если форма не создалась тогда должно быть tmpForm = nil
← →
APXi (2004-12-03 21:59) [12]Спасибо большое. Подходит.
← →
APXi (2004-12-03 22:00) [13]А без создания Exception никак нельзя сделать?
← →
Alexander Panov © (2004-12-03 22:02) [14]APXi (03.12.04 22:00) [13]
А без создания Exception никак нельзя сделать?
Ну если использовать не конструктор, а class function, то можно в каждом наследнике сщодавать свою функциюи вызывать по цепочке аналогичные функции из предка. Такой вариант тоже не сложен, мне кажется...
← →
APXi (2004-12-03 22:13) [15]// Ты имееш в виду так
TClass1=class
private
FParam: Integer;
public
constructor Create(param: Integer); virtual;
class function CreateObj(param: Integer): TClass1; virtual;
end;
TClass2=class(TClass1)
public
class function CreateObj(param: Integer): TClass1; override;
end;
{ TClass1 }
class function TClass1.CreateObj(param: Integer): TClass1;
begin
Result := nil;
if false then Result := TClass1.Create(param);
end;
{ TClass2 }
class function TClass2.CreateObj(param: Integer): TClass1;
begin
Inherited;
Result := nil;
if param=2 then Result := TClass2.Create(param);
end;
← →
Alexander Panov © (2004-12-03 22:16) [16]APXi (03.12.04 22:13) [15]
// Ты имееш в виду так
Нет, не так думал.TClass1=class
private
FParam: Integer;
public
constructor Create(param: Integer); virtual;
class function CreateObj1(param: Integer): TClass1;
end;
TClass2=class(TClass1)
public
class function CreateObj2(param: Integer): TClass2; override;
end;
{ TClass1 }
class function TClass1.CreateObj1(param: Integer): TClass1;
begin
Result := nil;
if false then Result := TClass1.Create(param);
end;
{ TClass2 }
class function TClass2.CreateObj2(param: Integer): TClass1;
var
Obj1: TClass1;
begin
Result := nil;
Obj1 :=TClass1.CreateObj1(param);
if Obj1=nil then Exit;
if param=2 then Result := TClass2.CreateObj2(param);
end;
Примерно так.
← →
Alexander Panov © (2004-12-03 22:17) [17]Прошу прощения, последние 2 строки -
if param=2 then Result := TClass2.Create(param);
end;
← →
APXi (2004-12-03 22:24) [18]Тогда еще надо будет делать
if Obj1=nil
then Exit
else Obj1.Free;
Тогда проще в TClass2.CreateObj2 проверять возможность создания этого объекта. Пока вижу выход только через твой пример с Exception.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c