【发布时间】:2012-12-18 13:17:03
【问题描述】:
我有一些用于旧版本 RADStudio 的派生 Stream 类,它们只是重新实现了 Read、Write、Seek 方法以及 Size 和 Position 属性。
我希望将这些移植到 XE3,但我看到现在(例如)Read 的三个重载 - 原来的一个,加上两个以 TBytes 作为参数的重载。
德尔福
function Read(var Buffer; Count: Longint): Longint; overload; virtual;
function Read(Buffer: TBytes; Offset, Count: Longint): Longint; overload; virtual;
function Read(var Buffer: TBytes; Count: Longint): Longint; overload;
C++
virtual int __fastcall Read(void *Buffer, int Count)/* overload */;
virtual int __fastcall Read(System::DynamicArray<System::Byte> Buffer, int Offset, int Count)/* overload */;
int __fastcall Read(System::DynamicArray<System::Byte> &Buffer, int Count)/* overload */;
我需要全部实现这三个还是只实现一个?如果只有一个,是哪一个……?
通常我可以从 VCL 源中找到它,但我目前刚刚获得试用版(无源)。
【问题讨论】:
-
如果您的旧代码重新实现了 Size 和 Position 属性,那么您一直在做错事。这些属性已经通过虚拟方法正确实现。
-
@RobKennedy :可能 ;-) 我正在重新定义“Size”属性(这可能是不必要的),但使用了我自己的 GetSize/SetSize 方法。不确定我是否需要处理 Position 属性——在任何地方都看不到这样的例子......
-
Size 和 Position 都是根据 Seek 方法实现的。 Seek 有两个版本,它们实际上是抽象的,尽管您只需覆盖其中一个;无论您省略哪一项,都会根据另一项实施。
-
@RobKennedy - 不,您必须在
TStream后代中覆盖SetSize,至少在 Delphi XE 中(没有 XE3)。 -
@Serg 仅当您想分配给 size 以实际执行某些操作时,您才必须覆盖它。 Rob 表示默认的
GetSize实现使用Seek,这是准确的。当人们考虑SetSize时,他会偏离准确性。
标签: delphi delphi-xe3 tstream