Today Recently on Stackoverflow i learned that:
i've been trying to make sense of it all, so here is a another, very specific question, supporting my main question dealing with constructors.
Update: replaced the entire question:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
When constructing TCellPhone, 3 constructors are avaible:
- Cup: Integer
- Cup: Integer; Teapot: string
- [Teapot: String = '']
Question: Why is constructor(Teapot: string='')
not being hidden?
Now i added a 3rd descendant:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
end;
When constructing TiPhone
four constructors are available:
- Cup: Integer
- Cup: Integer
- Cup: Integer; Teapot: string
- [Teapot: string = '']
Why are there four constructors? i overrode one of the existing three. Edit: This may be a bug in code-insight, it shows me four - yet how could i possibly call then when two are the same.
Using the original code again:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
it's already known that TCellPhone
has three constructors:
- Cup: Integer
- Cup: Integer; Teapot: string
- [Teapot: String = '']
How do i alter the declaration of TCellPhone
to hide the ancestor constructor? e.g. so that:
TNokia = class(TCellPhone)
end;
will only have two constructors:
- Cup: Integer
- Cup: Integer; Teapot: string
Now for the case where reintroduce
is used to hide a non-virtual ancestor. In the previous case TiPhone
has four constructors (ideally there would be only two - with TComputer
somehow hiding its ancestor). But even if i can't fix TComputer
, i can change TiPhone
to only have the one:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce;
end;
Now TiPhone
has only one constructor:
- Cup: Integer
Reintroduce is normally only used to suppress the warning about hiding virtual ancestors. In this case:
Create(Teapot: string = '')
isn't virtual - yet i can still use reintroduce to hide it.
But now, if i add another overloaded to TiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
Then suddenly the (previously hidden) ancestors come back:
- TiPhone.Create(7);
- TiPhone.Create('pink');
- TiPhone.Create(7, 'pink');
- TiPhone.Create();
As you can see, i'm struggling to understand the logic of
- when something is hidden
- how to hide something
- when something is shown
- how to show something
obj := TCellPhone.Create('foo')
? I find that surprising. – Borkreintroduce
. – Bork