Die conclusie kan ik niet trekken. Alhoewel ik het niet getest heb ben ik er zeer zeker van dat TFileStream.Size := 0 werkt na het lezen van de (D6) sourcode. En sterker nog, het zal hetzelfde doen als TFileStream.SetSize(0) aangezien dat de setter is van die Size property.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| TStream = class(TObject)
procedure SetSize64(const NewSize: Int64);
...
procedure SetSize(NewSize: Longint); overload; virtual;
procedure SetSize(const NewSize: Int64); overload; virtual;
...
property Size: Int64 read GetSize write SetSize64;
end;
THandleStream = class(TStream)
...
procedure SetSize(NewSize: Longint); override;
procedure SetSize(const NewSize: Int64); override;
...
end;
TFileStream = class(THandleStream)
...
end;
procedure TStream.SetSize64(const NewSize: Int64);
begin
SetSize(NewSize);
end; |
Zoals je ziet wordt de functie SetSize64 aangeroepen als setter van de property Size. Deze functie roept op zijn beurt 1 van de overloaded SetSize functies aan welke wat doen. Wat de implementatie van die laatste functies zijn is niet zo heel interresant in dit verhaal. Wat wel interresant is dat ze beide virtual zijn en dus samen met override polymorphisme veroorzaken.
THandleStream leid van TStream af en override de beide geoverloade SetSize functies. Hierin zit die extra implementatie die niet in TStream zat.
TFileStream leid weer af van THandleStream, maar voegt weinig toe in dit verhaal.
Uiteindelijk door de hulp van polymorphisme wordt de correcte THandleStream implementatie van Size := 0 aangeroepen. En dus moet het gewoon goed werken zolang de instantie maar een THandleStream of afgeleide is.
PS: Bovendien kan je TFileStream.SetSize(0) niet zomaar aanroepen, het is namelijk een protected functie.
We adore chaos because we like to restore order - M.C. Escher