4

私の最上位クラスはTBaseDBで、これには子孫TCommonDB( があり、 とTCommonDBのように複数の子孫が存在TProdDBします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. または?であるインスタンスに応じて、適切なプロシージャが呼び出されます。 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. 2 番目のケースではinherited、inTApple.ShowMessageTOrange.ShowMessageはどういう意味ですか? 彼らは手順のトップにいる必要がありますか? それらを省略するとどうなりますか?
于 2013-02-27T14:38:51.803 に答える