4

我的顶级类是TBaseDB,它有一个后代TCommonDB(,并且TCommonDB将有多个后代,比如TProdDBand TDevDB)。

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

直到运行时我才知道类类型。我想要有共同的代码,但不同的行为。

我想要的是这样的:

var
  MyObj: TBaseDB;
begin        
  //pseudo-code...
  if RadioButton1.Checked then
    MyObj := TBaseDB.Create
  else
    MyObj := TCommonDB.create;
  MyObj.Test1;    
end;

我似乎无法让它工作,我想它在我的班级定义中。应该如何Test1定义,以便:

  1. 我可以将我的变量声明为TBaseDB
  2. 创建的类可以是TBaseDBTCommonDB, 和
  3. 将根据实例是 a还是?调用正确的过程 TestTBaseDBTCommonDB
4

1 回答 1

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.

关键字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.

练习:

  1. 在每种情况下,如果您创建 的实例会发生什么TFruit
  2. 在第二种情况下,inheritedinTApple.ShowMessageTOrange.ShowMessage是什么意思?他们是否需要处于程序的顶端?如果你省略它们会发生什么?
于 2013-02-27T14:38:51.803 回答