Delphi(Win32)のクラス全体(クラスの機能だけでなく)を静的として宣言できますか?Delphi(Win32)の静的クラス
答えて
私は静的なクラスを.netのように仮定しています(伝統的なDelphi/Nativeのように静的ではありません)。その答えは「いいえ」です。
これはあなたが理解するのを助けるかもしれません:静的クラスは、多くの場合、Delphiのユニットに似た方法でカプセル化に使用されます。 –
私は推測したくないです。静かに*あなたが*何を意味するのかはっきりとわかりますか? –
「静的クラス」の意味がわかりません。クラスメソッドだけを持つクラスを宣言することができるので、クラスをインスタンス化せずにこれらのメソッドを呼び出すことができます。
TSomeClass.SomeMethod;
これは何ですか?
ネイティブではありません。
コードの目的に応じて、使用目的によってはSingleton Patternオブジェクトに置き換えることができます。
これを実装する上でのウォークスルーでは、ほぼすべてのバージョンのデルファイをカバーするthis guideをお勧めしますが、Delphi 2010を使用している場合は、改善のために新しいclass Constructors/Destructorsを使用することもできます。
たとえば、uDG_Utilsという名前の新しいユニットを作成したり、クラスを定義したり、そのクラスのグローバル変数を定義したり、クラスコンストラクターとデストラクタを管理する初期化/終了セクションで定義することができます。 これでmySuperDuperClass.SuperMethodのように呼び出すだけです。
静的メソッドだけを含むクラスを作成することができます。何らかの状態を維持する必要がある場合は、状態変数をvarパラメータとして渡す必要があります。 「適切に」クラスの範囲外のクラスの実装セクション内のグローバル変数のセットを持つよりも、他の静的変数にアクセスする方法は、たとえば、ありません:
はUNIT TestUnit;
INTERFACE
Type
TStaticClass = Class
public
procedure Foo(var Bar:String); static;
end;
IMPLEMENTATION
var
LastBar : String; // the last bar
LastRes : string; // the last result
Procedure TStaticClass.Foo(var Bar:String);
begin
if Bar <> LastBar then
LastRes := SomeCPUExpensiveProcess(Bar);
LastBar := Bar;
Bar := LastRes;
end;
INITIALIZATION
LastBar := '';
LastRes := SomeCPUExpensiveProcess('');
END.
(はい、私はこのスレッドを知っています古いですが、私は後世のためにこれを投稿すると思っていました)。
クラス関数とクラスプロシージャは静的メソッドを実装していることが指摘されています。しかし、静的クラス(Delphiクラスと比較して)の次の注目すべき動作は、静的クラスをインスタンス化できないということです。
デルファイのクラスは、指定しない場合、パブリックのデフォルト(パラメータなし)のコンストラクタを取得します。したがって、どのクラスもインスタンス化できます。 1つ以上のコンストラクタを明示的に宣言すると、このコンストラクタは提供されません。
クラスのプライベートセクションまたはプロテクトセクションでコンストラクタを宣言することによって、すべてのコンストラクタを削除できます。これにより、コンシューマのスコープからコンストラクタが削除されます。今はコンストラクタが1つしかなく、可視ではなく、クラスをインスタンス化できません。
例:
type
TMyStaticClass = class(TObject)
private
// Hide the default constructor, suppressing hint H2219.
{$HINTS OFF} constructor Create; {$HINTS ON}
public
class procedure Method1; // A static method
end;
implementation
constructor TMyStaticClass.Create;
begin
// Do nothing. This cannot be called.
end;
class procedure TMyStaticClass.Method1();
begin
// Do something here.
end;
あなたは、Delphiの新しいバージョンのいずれかを持っている場合は、もう少し適切であることをクラスをシール検討することができます。コンストラクタがプライベートではなく保護されている場合は、下位クラスCOULDをインスタンス化します。
編集
ここでは、コンパイラのヒントを負担しません(密封されたクラスをサポート)、新しいDelphiのバージョンについては、ケンに触発され、代替手段です。それはまだ完璧な解決策ではありませんが、ここにあります。
unit Unit1;
interface
type
TMyStaticClass = class sealed (TObject)
protected
constructor Create;
public
class procedure Method1; // A static method
end;
implementation
constructor TMyStaticClass.Create;
begin
// Do nothing. This cannot be called.
end;
class procedure TMyStaticClass.Method1();
begin
// Do something here.
end;
end.
ヒントをオフにしなければならないという事実は、これはコードが悪いことを伝えるはずです。 –
彼はサポートされていない機能を求めているので、完璧な解決策はありません。 ヒントについては、私は通常は同意し、ヒントを無効にしません。ヒントは、通常、間違いを深刻かつ捉えることができます。しかし、このケースをもっと見る。 1-コードはDelphi 7でヒントを生成しません。そのため、Delphi 2010ではコードは貧弱ですが、Delphi 7では貧弱ですか?まあ、たぶん。 2-警告は「宣言されていますが使用されていません」です。プライベートクラスを保護クラスに変更して2010年にクラスをシールすると、.Createはまだ隠されていますが、ヒントは消えてしまいます。それはそれをより良くするか? ... –
...私はそう思わない傾向があります。しかし私にはっきりさせてください。私はあなたが間違っているとは思わない、ちょうどこの特定のケースは可能性のある例外であり、インスタンス化を防ぐためにpublicコンストラクタで例外を投げるなど、多くの悪のほうが少ないと思う。 いずれにしても、この点でもあなたのポイントは有効であり、誰もそれを考慮しないようにしたくありません。 –
私の代わりに保護するためにコンストラクタを降格からインスタンス化されることを防止するために、(クラス内の抽象メソッドと混同しないように)抽象クラスを使用します
強制うTMyClass = class abstract
public
class procedure DoStuff; static;
end;
シングルトンパターンを防止し、インスタンス化の期間を防ぎます。
は、「クラス関数」のためのユーザーの検索のように見える:
type
TSomeClass = class
class procedure MyFunction(...);
これは、静的メソッドのようなものですので、それを呼び出す:
TSomeClass.MyFunction(...);
- 1. Delphi win32アプリケーションのセルフインストーラ
- 2. .NET RemotingとDelphi win32
- 3. 静的クラスと静的メソッド
- 4. Delphi/Win32の仮想ライブラリインタフェース?
- 5. 静的配列のDelphiレコード演算子
- 6. パブリック静的クラスのC#テストプライベート静的メソッド
- 7. ベース静的クラス
- 8. 静的クラス
- 9. 静的クラス
- 10. 静的クラスのメンバ
- 11. 静的クラスのオブジェクトインスタンス
- 12. 静的クラスのNullReferenceException
- 13. 静的クラスのテンプレートメソッドパターン
- 14. C++静的クラスと非静的クラスのメンバ
- 15. 静的クラスとシングルトン
- 16. 静的クラスとシングルトン
- 17. クラスと静的メソッド
- 18. ConfigurationManagerと静的クラス
- 19. 静的クラスはPhpStorm
- 20. は、静的クラスに
- 21. Spring Wire静的クラス
- 22. Javaアプレット静的クラス
- 23. のdllexportクラスの静的メソッド
- 24. 静的メソッドのクラスのコンストラクタ
- 25. Delphi VCL for Win32 - 複数のイベントハンドラ
- 26. C++クラスの静的宣言
- 27. Pythonの静的内部クラス
- 28. パブリック静的クラスのYAJSWエラー
- 29. クラス内のWCF静的メソッド
- 30. シングルトンと静的クラスのケーススタディ
手動で(それぞれ、すべての変数、オブジェクトとメソッド静的作りますクラスvar)。それはすべて – VibeeshanRC