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
You don’t use
reintroduceto hide a method of an ancestor class. You do that simply by declaring a method with the same name as one in the ancestor class without overriding or overloading it. You usereintroduceto suppress the warning that Delphi raises when the ancestor class’s method (the one being hidden) is virtual.If the descendant’s method overrides the ancestor’s, then it’s not hiding. Calls to the ancestor’s method are routed to the descendant’s instead.
If the descendant’s method overloads the ancestor’s, then it’s also not hiding. Both are available to call.