Конструктор с отличающимися параметрами

svnvlad
Дата: 06.06.2009 18:54:45
Здравствуйте!
Можно ли в дочернем классе создать конструктор с отличающимися параметрами, и внутри него вызывать inherited?
TFrmImageWorking = class(TForm)
    ADQuery1: TADQuery;
    ....
  private
    { Private declarations }
    Image: TImageEnView;
    ....
  public
    { Public declarations }
    constructor Create(AOwner: TObject; AConnection: TADConnection;
                       AImage: TImageEnView); override;
  end;

implementation

constructor TFrmImageWorking.Create(AOwner: TObject; AConnection: TADConnectin;
                                     AImage: TImageEnView);
begin
  inherited Create(AOwner);
  ADQuery1.Connection := AConnection;
  Self.Image := AImage;
end;
Dimitry Sibiryakov
Дата: 06.06.2009 19:29:46

svnvlad
Можно ли

Можно, разрешаю.

Posted via ActualForum NNTP Server 1.4

Anatoly Podgoretsky
Дата: 07.06.2009 10:21:46
override убери, но это глупо, Дельфи ООП позволяет иметь сколько угодно конструкторов.

--
http://www.podgoretsky.com
svnvlad
Дата: 07.06.2009 12:35:52
Anatoly Podgoretsky
override убери, но это глупо, Дельфи ООП позволяет иметь сколько угодно конструкторов.

То есть override используется только при одинаковых параметрах?
Назвать конструктор по-другому?
SQLap
Дата: 07.06.2009 12:48:10
svnvlad

То есть override используется только при одинаковых параметрах?


Да. Но можно из твоего неперекрытого Create (c большим числом параметров) вызвать

inherited Create(AOwner);

и затем выполнить с созданным экземпляром необходимые действия по твоим параметрам.
svnvlad
Дата: 07.06.2009 13:24:51
Anatoly Podgoretsky
override убери, но это глупо, Дельфи ООП позволяет иметь сколько угодно конструкторов.


Как тогда это объяснить? (Взято из документации ImageEn)
TIEBitmap.Create

Declaration

constructor Create;
constructor Create(ImageWidth,ImageHeight:integer; ImagePixelFormat:TIEPixelFormat = ie24RGB);
constructor Create(const FileName:string; IOParams:TIOParamsVals = nil);


Description

Creates a new TIEBitmap object.
The second overload creates the bitmap using specified parameters.
Third overload loads image from specified file. IOParams specifies the in/out parameters as TIOParamsVals objects.
Также здесь встречается 2 раза слово overload.
Anatoly Podgoretsky
Дата: 07.06.2009 13:26:55
SQLap
svnvlad

То есть override используется только при одинаковых параметрах?


Да. Но можно из твоего неперекрытого Create (c большим числом параметров) вызвать

inherited Create(AOwner);

и затем выполнить с созданным экземпляром необходимые действия по твоим параметрам.

Я бы именно так и получил, назвал бы CreateWithOtherParameterSet
Anatoly Podgoretsky
Дата: 07.06.2009 13:27:41
svnvlad
Anatoly Podgoretsky
override убери, но это глупо, Дельфи ООП позволяет иметь сколько угодно конструкторов.


Как тогда это объяснить? (Взято из документации ImageEn)
TIEBitmap.Create

Declaration

constructor Create;
constructor Create(ImageWidth,ImageHeight:integer; ImagePixelFormat:TIEPixelFormat = ie24RGB);
constructor Create(const FileName:string; IOParams:TIOParamsVals = nil);


Description

Creates a new TIEBitmap object.
The second overload creates the bitmap using specified parameters.
Third overload loads image from specified file. IOParams specifies the in/out parameters as TIOParamsVals objects.
Также здесь встречается 2 раза слово overload.

В том то и дело, что у тебя не встречается.
svnvlad
Дата: 07.06.2009 13:51:46
Anatoly Podgoretsky
svnvlad
Anatoly Podgoretsky
override убери, но это глупо, Дельфи ООП позволяет иметь сколько угодно конструкторов.


Также здесь встречается 2 раза слово overload.

В том то и дело, что у тебя не встречается.


Т.е. вместо override поставить overload?
TFrmImageWorking = class(TForm)
    ADQuery1: TADQuery;
    ....
  private
    { Private declarations }
    Image: TImageEnView;
    ....
  public
    { Public declarations }
    constructor Create(AOwner: TObject; AConnection: TADConnection;
                       AImage: TImageEnView); overload;
  end;

implementation

constructor TFrmImageWorking.Create(AOwner: TObject; AConnection: TADConnectin;
                                     AImage: TImageEnView);
begin
  inherited Create(AOwner);
  ADQuery1.Connection := AConnection;
  Self.Image := AImage;
end;
FlyD
Дата: 07.06.2009 15:06:18
svnvlad
Т.е. вместо override поставить overload?
С override не скомпилируется, т.к. семантика перегружаемого и родительского конструкторов
будет различаться.
С overload выдаст хинт о том, что родительский виртуальный конструктор скрыт новым.

Чем не нравится конструктор с новым именем?