13

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

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

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

4

4 に答える 4

66

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

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

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

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

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

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

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

いつ、なぜ使用するのですか?

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

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

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

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

Vehicle v = new Car();

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

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

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

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

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

于 2011-04-14T15:43:48.920 に答える
8

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

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

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

  • クラスはブループリント/パターンを形成し、それabstractが派生クラスにさまざまな(うまくいけば)透過的な方法で実装されます
  • クラスは、関連する可能性のあるメソッドstaticのコレクションの単なるコンテナです。static
于 2011-04-14T15:35:29.240 に答える
1

クラスは、使用するために継承する必要があるabstractクラスです。継承することしかできません。
それを継承するクラスのインスタンスを作成できます。

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

于 2011-04-14T15:34:37.450 に答える
-3

確かに、抽象クラスはインスタンス化できませんが、代わりに他のクラスのベースを形成します。利点は、機能を抽象クラスに入れて再利用を支援できることです。

静的クラスは、必要に応じてCLRによってインスタンス化されるクラスです。いつでもそのインスタンスは1つだけです。静的クラスの使用は非常に便利ですが、スレッド化と同時アクセスには注意が必要です。

于 2011-04-14T15:35:04.387 に答える