web-dev-qa-db-ja.com

C#の「抽象」インターフェース

これはアカデミックな質問です。おそらくXY問題の背後にありますそれは個別に投稿できます。後。しかし、私amは実際にはここにあるアカデミッククエスチョンに特に興味を持っています。


すべてに共通のプロパティを持つインターフェースのグループがあることがよくあります。そして、基本的なインターフェースを定義して、それらを共通化するために、一部は繰り返しの欠如のために、そして一部は正確な型を知らなくてもオブジェクトを渡し、共通のメソッドを使用できるようにしたいと考えています。

多分私はIFooRepositoryIBarRepositoryなどを持っているので、IRepository<TEntity>を宣言できます。

または、IHappyBotISadBotIConfusedBotがあり、それらすべてにIBotが共通しています。

特にこれらの基本インターフェースを直接実装するクラスはありません-justIBotを実装するものはありません。

interfacesではなく、classesの階層について話していた場合、それから私は「ああ...基本的なものは抽象クラスです」と言います。

IBotが直接実装されないという期待を文書化するために、インターフェイスで実行できる類似のことはありますか?.

私が興味を持っているその側面は、後でリフレクションを介して検出できる何かを行うことです。そのため、私が DI設定をテストする のとき、「ああ、このインターフェイスはそうではありませんexpectedは "abstract"であるため、バインド可能です。


18
Brondahl

おそらく、哲学的な質問への回答-しかし、クラスがIBotを実装したいのに、なぜ実装できないのでしょうか。

抽象クラスはどうですか?抽象基本BotクラスにIBotを実装して、Bot基本クラスが基本Botに期待されるすべての機能をチェックしていることを確認する方法として欲しいと思うかもしれません。

インターフェースは、何かができる/すべきことを定義するためのものであり、機能のリストです。私の心の中で、「何かがこの機能のリストを満たすと主張することはできない」と言ってもあまり意味がありません。

抽象クラスは、実装クラスの穴(抽象メソッドなど)を埋める必要がある場合があるため、意味があります。これは、インターフェースには当てはまりません。

10
David E

私はそうは思わないでしょう。インターフェイスの実装の詳細は、共同作業者から意図的に隠されています。インターフェイスの実装の詳細をインターフェイスコントラクトで指定できるようにすると、メタファーが混在してしまい、意味がなさそうです。

本当にこれを実現したいのであれば、マーカーAttributeクラス、たとえば[AbstractInterface]を導入することもできますが、その使用は非常に制限されている(そして疑わしい)と思います。

DIシステムがインターフェースが直接実装されているのか、スーパーインターフェースを介して実装されているのかを知る必要があるというあなたの動機付けの例は、私には納得できないようです。 DIシステムは実装を探すだけだと思います。

5
Rich