当我在基类上调用方法时,如何调用后代的实现?

use*_*073 3 delphi inheritance

我的顶级课程是TBaseDB,有一个后代TCommonDB(,并且TCommonDB将有多个后代,像TProdDBTDevDB).

让我们在每个类定义中创建一个函数,称为Test1.现在,它所做的ShowMessage('Some literal')只是向我展示正在执行的代码.

直到运行时我才知道类类型.我希望有共同的代码,但行为不同.

我想要的是这样的:

var
  MyObj: TBaseDB;
begin        
  //pseudo-code...
  if RadioButton1.Checked then
    MyObj := TBaseDB.Create
  else
    MyObj := TCommonDB.create;
  MyObj.Test1;    
end;
Run Code Online (Sandbox Code Playgroud)

我似乎无法让这个工作,我想它是在我的班级定义.应该如何Test1定义:

  1. 我可以声明我的变量为TBaseDB,
  2. 创建的类可以是TBaseDBTCommonDB,和
  3. 适当的 Test程序将取决于实例是一个被称为TBaseDB还是TCommonDB

And*_*and 10

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TFruit = class
  public
    procedure ShowMessage; virtual; abstract;
  end;

  TApple = class(TFruit)
  public
    procedure ShowMessage; override;
  end;

  TOrange = class(TFruit)
  public
    procedure ShowMessage; override;
  end;


{ TApple }

procedure TApple.ShowMessage;
begin
  Writeln('I''m an apple!');
end;

{ TOrange }

procedure TOrange.ShowMessage;
begin
  Writeln('I''m an orange!');
end;

var
  fruit: TFruit;

begin

  fruit := TApple.Create;

  fruit.ShowMessage;

  Writeln('Press Enter to continue.');
  Readln;

end.
Run Code Online (Sandbox Code Playgroud)

该关键字abstract允许您在基类中完全不执行任何操作.但是,您也可以在那里实现:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TFruit = class
  public
    procedure ShowMessage; virtual;
  end;

  TApple = class(TFruit)
  public
    procedure ShowMessage; override;
  end;

  TOrange = class(TFruit)
  public
    procedure ShowMessage; override;
  end;


{ TFruit }

procedure TFruit.ShowMessage;
begin
  Writeln('I''m a fruit.');
end;

{ TApple }

procedure TApple.ShowMessage;
begin
  inherited;
  Writeln('I''m an apple!');
end;

{ TOrange }

procedure TOrange.ShowMessage;
begin
  inherited;
  Writeln('I''m an orange!');
end;

var
  fruit: TFruit;

begin

  fruit := TApple.Create;

  fruit.ShowMessage;

  Writeln('Press Enter to continue.');
  Readln;

end.
Run Code Online (Sandbox Code Playgroud)

练习:

  1. 在每种情况下,如果您创建一个实例会发生什么TFruit
  2. 在第二种情况下,是什么inheritedTApple.ShowMessageTOrange.ShowMessage意味着什么呢?他们是否需要处于程序的首位?如果省略它们会发生什么?