4

私は、ジェネリックで継承可能な TSingleton クラスを定義しようとしています。これが私が進行中のものです:

  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom)
  strict private
    class var FInstance : RealClass;
  protected
    procedure InstanceInitialization;virtual;
  public
    destructor Destroy; override;
    class procedure Create; reintroduce;
    class function Instance : RealClass;
    class procedure InstanceFree;
  end;

目標は、継承ツリーにシングルトン パターンを「挿入」できるようにすることでした。したがって、次のようなものを宣言する代わりに:

  TMySingletonComponent = class(TComponent)

  end;

そこにシングルトンパターンを実装する必要がある場合、次のように宣言します。

  TMyGenericSingletonComponent = class(TSingleton<TMyGenericSingletonComponent,TComponent>)
  end;

残念ながら、これはうまくいきません。次のエラーが表示されます (D2010 の場合):

  TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) ///E2021 Class type required

今、私は疑問に思っていましたが、これは Delphi XE で機能しますか? D2010でこれを機能させるために使用できる「クリーンハック」はありますか? これがうまくいかない根本的な理由はありますか?

4

3 に答える 3

5

設計上、型引数の 1 つから派生するジェネリック クラスを作成することはできません。

于 2010-10-22T03:54:58.750 に答える
3

いいえ、うまくいきません。クラスをそれ自体で定義しようとしています。パラメータ内に入れるものはすべて、すでに完全に定義されている必要があります。

于 2010-10-21T21:00:34.033 に答える
2

何を手に入れたいですか?

私見、シングルトンは悪です。それらは、C++ の不適切な OOP 設計 (私が覚えている限りでは、コンソール アプリケーションでの入出力ストリームへのアクセス用) のために導入されました。そして、彼らは維持するのが地獄のようになる傾向があります。

あなたはいつでもそれらなしで生きることができます。Delphi は、私が言及した C++ の問題を抱えていないため、これは明らかに「Delphi の古典的な」プログラミング方法ではありません。

一部の Java プロジェクトでは、シングルトンが (ab) 使用されています。Google で検索すれば、私の言いたいことがわかるでしょう。

getter で共通クラスのプロパティを使用し、対応するフィールドがまだ nil の場合はインスタンスを初期化し、インスタンスが既に作成されている場合はインスタンスへのフィールド ポインターを直接返します。優れたパフォーマンス、優れたコード、優れた OOP プラクティス (「グローバル」クラスなし) を備えたシングルトン機能があり、後でこの機能が必要ない場合 (テスト用) は、シングルトン機能なしでクラスを実行できます。目的など)。

于 2010-10-22T06:03:25.463 に答える