1

現在、主にC#でOOPを学んでいます。インスタンス化できないクラスを作成する主な理由は何かに興味があります。抽象クラスを作成する場合の正しい例は何ですか? 抽象クラスを継承の方法で熱心に使用していることに気付きました。クラスがシステムで抽象化されている場合、およびクラスが抽象化されてはならない場合にいくつかのルールはありますか? たとえば、いくつかの点で似ている医者と患者のクラスを作成したので、両方とも抽象クラス Person から派生させました (両方とも名前と姓を持っているため)。それは間違っていましたか?質問がばかげている場合は申し訳ありませんが、私はこれに非常に慣れていません。

4

8 に答える 8

2

まだ誰も指摘していないことがいくつかありますので、指摘しておきたいと思います。

継承できるのは 1 つの基本クラス (abstract の場合もあります) のみですが、多くのインターフェイスを実装できます。この意味で、抽象クラスを継承することは、インターフェイスを実装することよりも密接な関係です。

したがって、後で2つの異なる抽象クラスを実装するクラスが必要であることに気付いた場合、あなたは深いたわごとに陥っています:)

「いつ抽象クラスを作成するか」というあなたの質問に答えるために、私は決して言いません.抽象として本当に必要な場合は、インターフェースを使用してください。コードを複製している状況に陥った場合は、抽象クラスに適している可能性がありますが、常に最初にインターフェイスと動作パターンを確認してください (たとえば、戦略パターンは、人々が間違って継承を使用して解決する多くの問題を解決します。継承よりも構成を優先します)。設計としてではなく、最終的な解決策として抽象クラスを使用してください。

OOP 全般をよりよく理解するために、OO 設計と OO コンポーネントの再利用性の概要を説明しているDesign Patterns: Elements of Reusable Object-Oriented Software (a book)を参照することをお勧めします。オブジェクト指向設計は、継承以上のものです:)

于 2013-09-24T12:51:24.023 に答える
0

'Doctor' と 'Patient' の両方を抽象クラス 'Person' から派生させることは問題ありませんが、おそらく Person を通常のクラスにする必要があります。ただし、「Person」が使用されているコンテキストによって異なります。

たとえば、「GameObject」という名前の抽象クラスがあるとします。ゲーム内のすべてのオブジェクト (例: Pistol、OneUp) は「GameObject」を拡張します。ただし、「GameObject」はクラスが持つべきものを記述しているため、「GameObject」を単独で持つことはできませんが、それらが何であるかについては詳しく説明していません。

たとえば、ゲームオブジェクトは次のように言うかもしれません:「すべてのゲームオブジェクトは何かのように見える必要があります」.ピストルはゲームオブジェクトが言ったことに沿って伸びることができ、「すべてのピストルは一端にグリップとトリガーが付いた長いバレルのように見える必要があります.」と言う.

于 2013-09-24T10:05:05.007 に答える
0

本質的には、 Person クラスをインスタンス化したくない場合は問題ありませんが、将来のある時点で Person クラスをインスタンス化する可能性があると推測しているため、それは抽象的であってはなりません。

現在の問題を修正するためにコーディングするという議論がありますが、決して発生しない可能性のある問題に対応するためではありません。そのため、Person クラスをインスタンス化する必要がある場合は、それを抽象としてマークしないでください。

抽象クラスは不完全であり、派生クラスで実装する必要があります... 一般的に言えば、私はインターフェイスよりも抽象基本クラスを好む傾向があります。

抽象クラスとインターフェースの違いを調べてください...

「抽象クラスとインターフェースの違いは、抽象クラスはメソッドのデフォルト実装を持つことができるため、派生クラスでメソッドをオーバーライドしない場合、抽象基本クラスの実装が使用されることです。インターフェースには実装を含めることはできません。 " このSO投稿から取得

于 2013-09-24T09:54:20.947 に答える
0

すでに述べたように、抽象クラスの使用を強制する人はいません。これは、多くのクラスに共通する特定の機能を抽象化するための方法論にすぎません。

あなたのケースは、2 つの異なる型に共通のプロパティがあるため、抽象クラスを使用する場所の良い例です。しかし、当然のことながら、 Person を単独でタイプとして使用することは制限されています。この制限をしたい場合は、基本的にあなた次第です。

一般に、 Person がインスタンス化されるのを防ぎたい場合を除き、モデルのようなクラスには抽象クラスを使用しません。

通常、インターフェースも定義しており、このインターフェースに対してさまざまな実装をコーディングする必要があるが、すべての実装に共通の機能をすでにカバーしている BaseClass も必要な場合は、抽象クラスを使用します。

于 2013-09-24T10:02:53.060 に答える
0

これはおそらく非学術的な定義ですが、抽象クラスは、インスタンス化する意味がないほど「抽象的」なエンティティを表す必要があります。

具象クラスによって拡張する必要がある「テンプレート」を作成するためによく使用されます。したがって、抽象クラスは一般的な機能を実装できます。たとえば、インターフェイスのいくつかのメソッドの実装、特定の動作の具体的なクラスへのデリゲートの実装などです。

于 2013-09-24T10:39:57.410 に答える