2009-09-29 38 views
6

Delphi(Win32)のクラス全体(クラスの機能だけでなく)を静的として宣言できますか?Delphi(Win32)の静的クラス

+0

手動で(それぞれ、すべての変数、オブジェクトとメソッド静的作りますクラスvar)。それはすべて – VibeeshanRC

答えて

5

私は静的なクラスを.netのように仮定しています(伝統的なDelphi/Nativeのように静的ではありません)。その答えは「いいえ」です。

+2

これはあなたが理解するのを助けるかもしれません:静的クラスは、多くの場合、Delphiのユニットに似た方法でカプセル化に使用されます。 –

+2

私は推測したくないです。静かに*あなたが*何を意味するのかはっきりとわかりますか? –

4

「静的クラス」の意味がわかりません。クラスメソッドだけを持つクラスを宣言することができるので、クラスをインスタンス化せずにこれらのメソッドを呼び出すことができます。

TSomeClass.SomeMethod; 

これは何ですか?

2

ネイティブではありません。

コードの目的に応じて、使用目的によってはSingleton Patternオブジェクトに置き換えることができます。

これを実装する上でのウォークスルーでは、ほぼすべてのバージョンのデルファイをカバーするthis guideをお勧めしますが、Delphi 2010を使用している場合は、改善のために新しいclass Constructors/Destructorsを使用することもできます。

1

たとえば、uDG_Utilsという名前の新しいユニットを作成したり、クラスを定義したり、そのクラスのグローバル変数を定義したり、クラスコンストラクターとデストラクタを管理する初期化/終了セクションで定義することができます。 これでmySuperDuperClass.SuperMethodのように呼び出すだけです。

1

静的メソッドだけを含むクラスを作成することができます。何らかの状態を維持する必要がある場合は、状態変数を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. 
-1

(はい、私はこのスレッドを知っています古いですが、私は後世のためにこれを投稿すると思っていました)。

クラス関数とクラスプロシージャは静的メソッドを実装していることが指摘されています。しかし、静的クラス(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. 
+2

ヒントをオフにしなければならないという事実は、これはコードが悪いことを伝えるはずです。 –

+0

彼はサポートされていない機能を求めているので、完璧な解決策はありません。 ヒントについては、私は通常は同意し、ヒントを無効にしません。ヒントは、通常、間違いを深刻かつ捉えることができます。しかし、このケースをもっと見る。 1-コードはDelphi 7でヒントを生成しません。そのため、Delphi 2010ではコードは貧弱ですが、Delphi 7では貧弱ですか?まあ、たぶん。 2-警告は「宣言されていますが使用されていません」です。プライベートクラスを保護クラスに変更して2010年にクラスをシールすると、.Createはまだ隠されていますが、ヒントは消えてしまいます。それはそれをより良くするか? ... –

+0

...私はそう思わない傾向があります。しかし私にはっきりさせてください。私はあなたが間違っているとは思わない、ちょうどこの特定のケースは可能性のある例外であり、インスタンス化を防ぐためにpublicコンストラクタで例外を投げるなど、多くの悪のほうが少ないと思う。 いずれにしても、この点でもあなたのポイントは有効であり、誰もそれを考慮しないようにしたくありません。 –

5

私の代わりに保護するためにコンストラクタを降格からインスタンス化されることを防止するために、(クラス内の抽象メソッドと混同しないように)抽象クラスを使用します

強制う
TMyClass = class abstract 
public 
    class procedure DoStuff; static; 
end; 

シングルトンパターンを防止し、インスタンス化の期間を防ぎます。

8

は、「クラス関数」のためのユーザーの検索のように見える:

type 
TSomeClass = class 
class procedure MyFunction(...); 

これは、静的メソッドのようなものですので、それを呼び出す:

TSomeClass.MyFunction(...);