web-dev-qa-db-ja.com

C#の抽象クラスと静的クラス

重複の可能性:
抽象クラ​​スと静的クラスの違いは何ですか?

こんにちは
C#の抽象クラスと静的クラスのすべての違いを知りたいのですが
何を、なぜ使用するのですか?

抽象クラスは、インスタンスを作成できないクラスであるというのは本当ですか?
ありがとう

13
Dan

C#の抽象クラスと静的クラスのすべての違いを知りたいのですが。

そのような質問をしないでください。私は何百もの違いをリストするのに何時間も費やすことができましたが、どれもあなたには関係ありません。

C#の抽象クラスと静的クラスの最も重要な違いは何ですか?

それはもっと似ています。

抽象クラスは通常、型階層で何かをモデル化することを目的としています。たとえば、トラックは一種の乗り物であり、飛行機は一種の乗り物であるため、基本クラスの乗り物と派生クラスのトラックと飛行機があるとします。しかし、「車両」は抽象的なものです。より具体的なものではなく、単なる車両である車両はありません。その概念を抽象クラスで表します。

対照的に、静的クラスは何もモデル化することを意図していません。これは、大量のコードを格納するための便利な方法です。本当にそれはクラスであるべきではありません。 VBは、そのようなものを「クラス」ではなく「モジュール」と呼ぶことで、より適切な選択をしました。技術的にはオブジェクトから継承しますが、静的クラスは論理的には実際には型階層にありません。静的メンバーを保持するための単なるバケット。

静的クラスは、拡張メソッドのコンテナーとしてよく使用されます。

いつ、なぜ使用しますか?

「XはYの一種」という形式のモデルを構築する場合は、抽象クラスを使用します。 「車は乗り物の一種」、「正方形は形の一種」、「雑誌は出版物の一種」のように、「Y」は抽象的な概念です。 「従業員は一種の人」のようなものには使用しないでください。人は具体的である必要があります。人は抽象的な概念ではありません。ただの人である人もいますが、他にない乗り物はありません。

拡張メソッドを作成する場合、または論理的には一致するがオブジェクトに関連付けられていないコードが多数ある場合は、静的クラスを使用します。たとえば、関連する数学ルーチンがたくさんある場合、それは静的クラスの良い候補です。

抽象クラスは、インスタンスを作成できないクラスであるというのは本当ですか?

いいえつまりない本当です。抽象クラスのインスタンスを作成できます。これを行うには、より派生したクラスのインスタンスを作成します。

Vehicle v = new Car();

明らかにvはVehicleのインスタンスを参照しているため、抽象クラスのインスタンスを作成できます。できないことは、より派生した具象クラスのインスタンスでもない抽象クラスのインスタンスを作成することです。

対照的に、静的クラスのインスタンスを作成することはできません。

これがあなたが尋ねなかった質問です:

静的クラスと抽象クラスの間の実装関係は何ですか?

静的クラスは、実際にはCLRの概念として実際には存在しません。クラスで「静的」と言うとき、実際に行うことは、パブリックコンストラクターのない抽象シールクラスを生成することです。抽象的であるため、直接作成することはできません。封印されているため、より派生したクラスを作成してインスタンス化することはできません。

67
Eric Lippert

abstractまたはstaticクラスのインスタンスを作成することは不可能であることは事実ですが、それが類似点の終わりです。

  • abstractから継承できますstaticから継承できません
  • abstractにインスタンスメソッドを持つことができますstaticにインスタンスを持つことはできません
  • abstractクラスはインターフェースを実装できますstaticクラスは実装できません

基本的に彼らは2つの異なる目的を果たそうとしています

  • abstractクラスは、ブループリント/パターンを形成します。これは、派生クラスにさまざまな(できれば)透過的な方法で実装されます。
  • staticクラスは、関連する可能性のあるstaticメソッドのコレクションの単なるコンテナです。
8
JaredPar

abstractクラスは、使用するために継承する必要があるクラスです。継承のみが可能です。
それを継承するクラスのインスタンスを作成できます。

staticクラスは、インスタンスを持つことができないクラスです。このようなクラスには、staticメンバーしかありません。
staticクラスは継承できず、他のクラスも継承できません。

1
SLaks