2012-02-01 3 views
17

が始まる、仮想的なオブジェクト階層を考えてみましょうすぐそこです:デルファイ:メソッド「作成」をベースの仮想メソッドを隠し - それは

TFruit = class(TObject) 
public 
    constructor Create(Color: TColor); virtual; 
end; 

とその子孫:

TApple = class(TFruit) 
public 
    constructor Create(); overload; virtual; 
    constructor Create(Color: TColor); overload; override; //deprecated. Calls other constructor - maintaining the virtual constructor chain 
end; 

考えはここにあります私はをオーバーライドしました仮想クラスのコンストラクタ、オーバーロードも仮想であることがあります。

Delphiは文句:

メソッド '作成' 基本型の仮想メソッドを隠し 'TFruit'

それはそれを隠していない場合を除き - それはすぐそこです!

  • オーバーライド仮想祖先のメソッド、および
  • 私は過負荷にそれは別のバージョン

との契約は何ですか?

+1

「メソッド 'Create'は、基本タイプ 'TFruit'の仮想メソッドを隠す」と表示されます。あなたは本当に "基本型" TApple '"を得ていますか? – hvd

+0

@RBAこれを避けるために、 'reintroduce;'を使うことはできますが、この場合は警告が間違っています。 – hvd

+0

これはDelphi 5に固有のものですか? – EMBarbosa

答えて

24

2種類の溶液:

type 
    TFruit = class(TObject) 
    public 
    constructor Create(Color: TColor); virtual; 
    end; 

    TApple = class(TFruit) 
    public 
    constructor Create(); reintroduce; overload; 
    constructor Create(Color: TColor); overload; override; 
    end; 

かは:

type 
    TFruit = class(TObject) 
    public 
    constructor Create; overload; virtual; abstract; 
    constructor Create(Color: TColor); overload; virtual; 
    end; 

    TApple = class(TFruit) 
    public 
    constructor Create(); override; 
    constructor Create(Color: TColor); override; 
    end; 
+3

+1。私はXE2のコンパイラを満足させる 'overload'、' virtual'、 'override'の組み合わせを見つけることができませんでした。 :) –

+2

IMHO、あなたが再導入が必要な場合、あなたのコードは恐ろしいにおいをします。 –

+0

@WarrenPその臭いは、しばしば継承を破る 'reintroduce'の他の使い方から来ます。 – NGLN

5

これが問題の "最初に来た" の並べ替えのように見えます。 (NGLNが解決策を見つけたようです。)

もう一つの解決法もあります。

interface 

type 
    TFruit=class(TObject) 
    public 
    constructor Create(Color: TColor); virtual; 
    end; 

    TApple=class(TFruit) 
    public 
    constructor Create(Color: TColor = clRed); override; 
    end; 

implementation 

{ TFruit } 

constructor TFruit.Create(Color: TColor); 
begin 
    inherited Create; 
end; 

{ TApple } 

constructor TApple.Create(Color: TColor); 
begin 
    inherited; 
end; 

// Test code 
var 
    AppleOne, AppleTwo: TApple; 
begin 
    AppleOne := TApple.Create; 
    AppleTwo := TApple.Create(clGreen); 
end; 
+1

+1創造性のために。しかし、再導入は不要で、 'clDefault'を使用します。 ;) – NGLN

+0

ありがとうございます。 :) あなたが正しい。私はそれが以前の試行の残念だと思うし、コンパイラは不平を言っていないので、私はそれをキャッチしませんでした。そして私は 'clDefault'色のリンゴを見たことがありません。 ;) –

+0

私はリンゴを着色することについて言及していませんでしたが、TAppleの追加されたパラメータのないコンストラクタの質問の目的に固執しました。明らかにOPは、色のないリンゴがあると考えています。 ;)さらに、clDefaultはどんな色ですか?それはリンゴのデフォルトの色ですね。 (これは黒で実装されていますが、TColorは単純に整数値が必要なためです)。 – NGLN

関連する問題