2011-11-03 3 views
6

私は数多くのS/O投稿を検索しましたが、私を助ける答えは見つかりませんでした。
私は、抽象クラスとインタフェースとは何かについての精神的なビジョンを得たいと考えています。私はこの投稿Real world abstract class usage simple samplesを読んだが、私はまだその概念についてはっきりしていない。asp.netの抽象クラスvsインターフェイスの現実世界概念を取得しようとしています

私は誰かが "Person"オブジェクトの形で現実の世界を記述できることを望んでいます。 だから、継承は可能「人」だろう - >「従業員」 - >「マネージャー」
およびオーバーライドが、私は抽象クラスを記述することができますどのように「従業員の給与が」なる「営業社員手数料」

だろうとPersonオブジェクトの概念内のインタフェース?

答えて

9

インタフェースと抽象クラスを使用する主題については、さまざまな見解があります。インタフェースは、オブジェクトの動作(何ができるか)を表現し、抽象クラスはそれが何であるかを定義する必要があります。基本的には、オブジェクトの迫害から「私は」対「私は」できる。

Personがある場合は名詞であるため、抽象クラスを使用して定義します。人であることは、そのクラスから継承します。 PersonがすべてのPersonに及ぶことができない動作を記述する動作を定義したい場合は、それをインタフェースに配置する必要があります。

定義した関係(Person - > Employee - > Manager)を使用すると、EmployeeがIFirableを実装し、ManagerがIFirerを実装していると言えるでしょう。従業員は解雇され、マネージャは従業員を解雇することができます。

+0

良い類推。人が抽象クラスだと言っていますか? – DotNetRookie

+1

@DotNetCookie - 私は本当にそうするかどうかは言いたくありません。それはあなたが解決しようとしている問題のコンテキストに依存します。 「普通の」Personオブジェクトをインスタンス化できる必要がある場合、それはあまり意味がありません。この場合(Person - > Employee - > Manager)、基底クラスのPerson、abstractを作るのが理にかなっています。 –

+1

Personとのインターフェイスに使用する動作は、Feedメソッドを宣言できるIEatです。要するに、インタフェースは、Mammal:IEat> Person>など、PlantLife:IEat> Cactusのようなインタフェースなので、PersonはPlantLife(それのような行為)ではなく、何らかの方法で食べる。 –

4

私はあなたの人の例を使用していないことをお詫びします。

ほとんどの人々がすでに理解していることに類推して、プログラミングの背景のない人に、概念を説明するのが最も簡単です。

インタフェースはカビのようなものです、それは最終製品の形状を有していますが、異なる色や素材のすべての種類とそれを埋めることができます。

は、我々は、例えばプラスチック製の果物を作っているとしましょう。たとえ色とテクスチャがまったく異なっていても、最終的にはすべて同じ形になります。

抽象クラスは、ペイントのような余分なステップを必要とするものに似ています。あなたは、基本的なプラスチックのフルーツを作成し、いくつかの絵や毛皮を貼り付けるためにそれを送った。

未完成の果物は抽象的なクラスのようなものであり、最終製品の定義がより深くなり、それから型ができますが、それ自体は完全ではありません。それは完了するためにより多くの作業を必要とし、最終製品は全く異なる色になる可能性がありますが、基本的には同じです。

私はそれが助けてくれることを願っています!

4

OK、私はあなたの質問を理解している場合を見てみましょう...

私はインタフェースと抽象クラスの使用との間の差異および/または類似のあなたのconceptaullyわからないと思います。それが問題であれば、私の「10のためのスターター」を要約します。

抽象クラスをインスタンス化することはカントが、実装の詳細を含めることができますので、1からクラスを派生するとき、あなたは抽象クラスに入れ契約と任意のデフォルトの動作を取得します。例えば、あなたのPersonクラス(この例では抽象クラスと仮定します)は、派生したEmployeeクラスまたはManagerクラスが持っていなければならないコントラクトを定義しますが、いくつかのデフォルト動作を提供することもできます。

インターフェイス一方、は、の契約のみを指定します。実装するクラスが何をしなければならないか、彼らはどんな実装方法も提供できません。例えば、あなたの例の "Person"が実際にインターフェイスだった場合、それを実装するクラス(従業員とマネージャ)は何をしなければならないのかを定義していますが、その契約のデフォルト実装を提供することはできません。

多くの言語(Java、C#、Delphi)では、1つの親クラスから継承できますが、多くのインターフェイスを実装できます。

関連する問題