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

Вниз

как конструктору вернуть 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
1-1139761602
Fl@sh
2006-02-12 19:26
2006.03.19
CryptoApi & криптопровайдеры и информацыя о них


15-1140506722
начинающий
2006-02-21 10:25
2006.03.19
Python


3-1138254928
syte_ser78
2006-01-26 08:55
2006.03.19
аналог экселевской группировки


6-1133323988
Lex_!
2005-11-30 07:13
2006.03.19
Отправка параметров методом пост


15-1140533892
Fl@sh
2006-02-21 17:58
2006.03.19
Книга по FireBird 1.0.3 or 1.5..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский