私は一連のクラスを開発しています 共通のインターフェースを実装する。私のライブラリの利用者は、これらのクラスのそれぞれが特定の静的関数のセットを実装することを期待するでしょう。とにかく、これらのクラスを装飾して、関数の1つが実装されていない場合にコンパイラーがキャッチできるようにすることはできますか?.
消費するコードをビルドするときに、最終的にはキャッチされることを私は知っています。また、一種のファクトリクラスを使用してこの問題を回避する方法も知っています。
クラスに静的関数を要求するための構文/属性があるかどうかを知りたいだけです。
Ed混乱を避けるためにWordの「インターフェース」を削除しました。
いいえ、C#ではこれに対する言語サポートはありません。私がすぐに考えることができる2つの回避策があります:
(更新)
実際、ユニットテストを行っている限り、最初のオプションは、(私のように)厳密な「静的型付け」のバックグラウンドを持っている場合に考えられるほど悪くはありません。事実は;動的言語では正常に機能します。そして確かに、これはまさに私の 汎用演算子 コードが機能する方法です-それは静的演算子を持っていることを望んでいます。実行時に、そうしないと、適切なモックトーンであなたを笑わせます...しかし、コンパイル時にチェックすることはできません。
いいえ。基本的には、一種の「静的ポリモーフィズム」を求めているように聞こえます。これはC#には存在しませんが、ある種の ジェネリックスの観点から役立つ可能性のある「静的インターフェイス」の概念 を提案しました。
couldできることの1つは、特定のアセンブリ内のすべてのタイプがルールに従っていることを確認するための簡単な単体テストを作成することです。他の開発者もインターフェイスを実装する場合は、そのテストコードを共通の場所に配置して、インターフェイスを実装するすべての人が自分のアセンブリを簡単にテストできるようにすることができます。
これは素晴らしい質問であり、私のプロジェクトで遭遇した質問です。
一部の人々は、インターフェースと抽象クラスはポリモーフィズムのためだけに存在し、タイプに特定のメソッドを実装するように強制するためではないと考えています。個人的には、ポリモーフィズムを主なユースケースと見なし、強制実装を二次的なユースケースと考えています。私はかなり頻繁に強制実装手法を使用します。通常、テンプレートパターンを実装するフレームワークコードに表示されます。基本/テンプレートクラスはいくつかの複雑なアイデアをカプセル化し、サブクラスは抽象メソッドを実装することによって多数のバリエーションを提供します。実用的な利点の1つは、抽象メソッドがサブクラスを実装する他の開発者にガイダンスを提供することです。 Visual Studioには、メソッドをスタブ化する機能もあります。これは、メンテナンス開発者が数か月または数年後に新しいサブクラスを追加する必要がある場合に特に役立ちます。
欠点は、C#でこれらのテンプレートシナリオの一部が特定にサポートされていないことです。静的メソッドはその1つです。もう1つはコンストラクターです。理想的には、ISerializableは、開発者に保護されたシリアル化コンストラクターの実装を強制する必要があります。
最も簡単なアプローチは、おそらく(前に提案したように)自動テストを使用して、静的メソッドが目的のタイプに実装されていることを確認することです。すでに述べたもう1つの実行可能なアイデアは、静的分析ルールを実装することです。
3番目のオプションは、 PostSharp などのアスペクト指向プログラミングフレームワークを使用することです。 PostSharpは、アスペクトのコンパイル時検証をサポートします。コンパイル時にアセンブリを反映する.NETコードを記述して、任意の警告とエラーを生成できます。通常、これはアスペクトの使用法が適切であることを検証するために行いますが、テンプレートルールの検証にも使用できなかった理由がわかりません。
残念ながら、いいえ、このような言語に組み込まれているものはありません。
これに対する言語サポートはありませんが、静的分析ツールを使用して強制することができます。たとえば、クラスの属性またはインターフェイスの実装を検出し、特定の静的メソッドの存在を確認するFxCopのカスタムルールを作成できます。
シングルトンパターンは、すべての場合に役立つわけではありません。私の例は私の実際のプロジェクトからのものです。不自然ではありません。
サードパーティのORMのクラスから継承するクラス(「ウィジェット」と呼びましょう)があります。静的メソッドが宣言されていることを確認するためだけにウィジェットオブジェクトをインスタンス化すると(したがって、データベースに行が作成されます)、クリーンアップしようとしているものよりも大きな混乱が発生します。
この余分なオブジェクトをデータストアで作成する場合、ユーザーや計算などから非表示にする必要があります。
C#のインターフェイスを使用して、一連のクラスに共通の機能を実装していることを確認します。
これらの機能を実装するメソッドの中には、実行するためにインスタンスデータを必要とするものがあります。これらのメソッドをインスタンスメソッドとしてコーディングし、C#インターフェイスを使用してクラスに存在することを確認します。
これらのメソッドの一部はインスタンスデータを必要としないため、静的メソッドです。静的メソッドでインターフェースを宣言できれば、コンパイラーは、インターフェースを実装していると言っているクラスにこれらのメソッドが存在するかどうかを確認できます。
Marc Gravellが提案したように、必要なものに近づくためのアプローチはシングルトンです。
とりわけ、インターフェースを使用すると、クラスにある程度の抽象化を提供できるため、実装するタイプに関係なく、特定のAPIを使用できます。ただし、静的クラスを使用するには静的クラスの型を知る必要があるので、なぜそのクラスを強制して一連の関数を実装する必要があるのでしょうか。
[ImplementsXXXInterface]のようなカスタム属性を使用して、この属性を持つクラスが実際に必要なインターフェイスを実装していることを確認するためのランタイムチェックを提供できますか?
これらのコンパイラエラーが発生した直後の場合は、次の設定を検討してください。
これは少し余分なコードですが、誰かが必要なメソッドを実装していない場合はわかります。
いいえ、この機能には意味がありません。インターフェイスは基本的に、多重継承の縮小形式です。これらは、非静的仮想メソッドを子孫クラスで適切に呼び出すことができるように、仮想関数テーブルを設定する方法をコンパイラーに指示します。静的メソッドは仮想にすることはできないため、それらにインターフェースを使用しても意味がありません。