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并且(当然)抛出一个抽象错误。

我希望它动态调用子类的 function getID,这永远不会引起问题,因为par0它始终是一个子类,Packet因为Packet它本身是抽象的。

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 回答