2
   TMyDataList<T: TBaseDatafile, constructor> = class(TObjectList<TBaseDatafile>)
   public
      constructor Create;
      procedure upload(db: TDataSet);
   end;

ブログの投稿 (どこにあるか覚えていません) で、これがジェネリック オブジェクトの特定の基本型を持つジェネリック ベースのクラスを宣言する方法であると読みました。そして、コンパイラはそれを問題なく受け入れます。でも使おうとすると協力してくれない。

type
   TDescendantList = TMyDataList<TDescendantDatafile>;

これにより、コンパイラ エラーが発生します。

[DCC エラー] my_database.pas(1145): E2010 互換性のない型: 'TDescendantDatafile' および 'TBaseDatafile'

問題は、1145 は有効な回線でさえないということです。問題のファイルは #1142 で終わり、問題の型宣言は #20 行にあります。これは、コンパイラの不具合ではないかと思います。それとも、構文が正しくないだけですか?これを機能させる方法を知っている人はいますか?

編集: Jim は、試してみると問題なくコンパイルできると指摘しました。もう少し情報: 基本データファイル型と汎用リストは同じユニットで宣言されていますが、TDescendantDatafile は 2 番目のユニットにあり、TDescendantList は 3 番目のユニットに定義されています。私はすでに D2009 のコンパイラで、ジェネリックが複数のユニットにまたがって型をめちゃくちゃにするバグを発見し、報告しました。これは関連している可能性があります。誰でもこれを確認できますか?

4

2 に答える 2

2

TObjectList<> の定義は次のとおりです。

TObjectList<T: class> = class(TList<T>)

だからあなたは次のようなことをしたい:

TMyDataList<T: TBaseDatafile> = class(TObjectList<T>)

残念ながら、それはうまくいきません。幸いなことに:

TMyDataList<T: class> = class(TObjectList<T>)

動作しますが、それはおそらくあなたが望むものではありません。クラス型を利用しないためです。ここでは、クラス指定子が少し奇妙だと思います。(TObject は問題を回避する必要がありました)。しかし、それはあなたにとって何の助けにもなりません。

次に、次のように動作します。

  TBaseDataFile = class
  end;

  TDescendantDatafile = class (TBaseDataFile)
  end;

  TMyDataList<T: TBaseDataFile> = class(TObjectList<TBaseDataFile>)
  public
    constructor Create;
  end;

TDescendantDataFile は TBaseDataFile を継承していますか?

昔は (turbo pascal を読んで) 文字が見えないために行番号が間違っていることがありました。しかし、それはまだ有効ではないと思います。

于 2008-12-21T19:19:55.750 に答える
1

TDescendantDatafileが TBaseDataFileから派生した場合、私のマシンでは問題なく動作します。クラス階層を確認してください。

TDescendantDatafileの祖先を変更すると、同じエラー メッセージが表示され、正しい行番号が表示されます。コンパイラが間違った行番号を与えている場合は、プロジェクトを閉じてから再度開き、フル ビルドを実行します。

于 2008-12-21T20:56:37.647 に答える