Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

как конструктору вернуть NUL?   Найти похожие ветки 

 
Yozj ©   (2006-03-01 16:09) [0]

Создаю класс, в конструктор передаю параметр - имя файла, как сделать так, чтобы если такого файла не существует конструктор возвращал NIL, а не ссылку на объект?
То есть, чтобы я мог провести такой трюк:
F := TMyClass.Create(path);
if F = nil then
...
else
...


 
DesWind ©   (2006-03-01 16:11) [1]

Можно по аналогии TFileStream генерить ошибку в конструкторе.


 
Сергей М. ©   (2006-03-01 16:28) [2]

Считай что никак.


 
Сергей М. ©   (2006-03-01 16:32) [3]

constructor TMyClass.Create(path);
begin
  if ФайлНеСуществует(path) then
    raise Exception.Create("Файл не существует !");
...
  inherited [Create(...)];
...
end;

...

F := nil;
try
 F := TMyClass.Create(path);
except
end;

if F = nil then
...
else
...


 
Ega23 ©   (2006-03-01 17:04) [4]

Не передавай его в конструктор, заведи property и не мучайся.


 
Гаврила ©   (2006-03-01 18:13) [5]

Концептуально правильно поднимать исключение.
Объект будет разрушен автоматически (при исключении в конструкторе).
Если все таки нужно вернуть nil
то нужно перекрыть метод NewInstance (вернуть в нем то, что считаешь нужным)
но за последствия отвечать будешь самостоятельно


 
Yozj ©   (2006-03-01 18:35) [6]

Ради интереса попытался поработать с методом NewInstance, решил его не трогать. Использовать исключение в конструкторе тоже плохо, по отношению к программисту (даже ко мне самому), который этот класс будет использовать... значит действительно самое простое использовать проперти.
Всем спасибо!


 
Yozj ©   (2006-03-01 18:35) [7]

Ради интереса попытался поработать с методом NewInstance, решил его не трогать. Использовать исключение в конструкторе тоже плохо, по отношению к программисту (даже ко мне самому), который этот класс будет использовать... значит действительно самое простое использовать проперти.
Всем спасибо!


 
Ega23 ©   (2006-03-01 18:38) [8]

Ха. Можно хитрее. Через class procedure


 
Гаврила ©   (2006-03-01 18:49) [9]


> Yozj ©  


> Использовать исключение в конструкторе тоже плохо, по
> отношению к программисту (даже ко мне самому), который
> этот класс будет использовать...


Полагаю что наоборот.
Два варианта (предположим что класс используешь не ты)
1. В конструкторе осмысленное исключение
"файл такой-то не найден"
программист сразу получает его и понимает в чем дело. Он может его даже не обрабатывать секцией Except- выполнение кода прервется ,стек очистится, и если ни одной секции Except не встретится, уже пользователь получит MessageBox с текстом исключения, из которого понятно, в чем, собственно, дело.
2. конструктор вернул nil (предположим что это реализовано)
программист создал объект, обращается к нему дальше и получае Access Violation.
"В чем дело... надо разбираться, лазить по чудому коду, читать документацию".
Предположим что он (другой программист) знает, что твой конструктор может вернуть nil.
и это означает что произошла ошибка... а какая? нет файла? а может быть другая какая-нибудь, например файл есть, но он поврежден.
Как их отличить между собой?


 
Гаврила ©   (2006-03-01 19:06) [10]

Вдогонку
понятно ,ч то реализовать "чтобы работало" можно по разному, весь вопрос в том, как удобнее, где меньше кода.
вариант "nil" предполагает необходимость вставки дополнительной проверки на nil во всех местах, где вызывается конструктор.
Например, ты не передаешь путь в конструктор, а присваиваешь проперти.
Опять же - как сигнализировать вызывающей стороне об ошибке "нет файла"?
- либо опять через исключение
(а не проще тогда поместить его в конструктор? тем более что если этот класс не имеет смысла без связки с нормальным существующим файлом, то при таком раскладе в тот период времени ,когда он уже создан, но свосйстов еще не присвоено, но являет собой достаточно странную сущность и работать не может. Потенциально это ведел к ошибкам)
- Либо через какие-то булевские флаги
это будет опять требовать вставки дополнительных проверок снаружи - то есть приведет к дублированию кода и вероятности неправильного использования класса


 
Ega23 ©   (2006-03-01 19:14) [11]


unit Unit2;

interface

uses SysUtils, Dialogs;

type
 TMyClass=class
  private
   FFileName:String;
  public
   constructor Create(aFileName:String);
   class function Init(aFileName:String):TMyClass;
  end;

implementation

{ TMyClass }

constructor TMyClass.Create(aFileName:String);
begin
FFileName:=aFileName;
ShowMessage(FFileName);
end;

class function TMyClass.Init(aFileName: String): TMyClass;
begin
 if not FileExists(aFileName) then Result:=nil
 else
 Result:=TMyClass.Create(aFileName);
end;

end.



И теперь использование:


procedure TForm1.Button1Click(Sender: TObject);
begin
 MyClass:=TMyClass.Init("C:\1.bmp");
end;




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

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.03 c
15-1140882588
grisme
2006-02-25 18:49
2006.03.19
Плохое детство


2-1141452138
Ezorcist
2006-03-04 09:02
2006.03.19
Недавняя олимпиада для школьников по прграммерству


3-1138104210
box
2006-01-24 15:03
2006.03.19
Вычисления по связанным таблицам


15-1140721369
ArtemESC
2006-02-23 22:02
2006.03.19
Иконки Delphi...


15-1140613855
Compton's G
2006-02-22 16:10
2006.03.19
98 понимает NFTS или нет?