2

Packet抽象メソッドを持つクラスがありgetIDます:

Type
  Packet = class
    ...
    function getID() : Integer;virtual;abstract;
    class procedure writePacket(par0 : Packet; par1 : TIdTCPConnection);
    ...
implementation 

class procedure Packet.writePacket(par0 : Packet; par1 : TIdTCPConnection);
// par1 is a TCP connection used to send data through the network; 
begin
  par1.writeInteger(par0.getID());
  //some code following 
end;

私は次のサブクラスを持っています:

type
  PacketTest = class(Packet)
    ...
    function getID() : Integer;
    ...

function PacketTest.getID():Integer;
begin
  result := {some value individual for each subclass}
end;

writePacketここで、パケットのサブクラスをとしてスーパークラスのクラスプロシージャをpar0呼び出します。これにより、サブクラスの関数が呼び出されますgetID。代わりに、スーパークラスの関数getIDを呼び出し、(もちろん)抽象的なエラーをスローします。

サブクラスの関数を動的に呼び出したいのですが、それ自体が抽象であるため、は常にのサブクラスであるgetIDため、問題が発生することはありません。par0PacketPacket

4

1 に答える 1

6

サブクラスのの宣言にgetIDは、overrideキーワードが必要です。

type
  PacketTest = class(Packet)
    function getID: Integer; override;
  end;

function PacketTest.getID: Integer;
begin
  Result := {some value individual for each subclass}
end;
于 2012-09-06T15:24:08.490 に答える