2016-12-21 6 views
0

私の質問です。これらは同じですか?私は魚クラスのペットのクラスをインスタンス化しているかのよう理解に問題があり、拡張してインスタンス化する。クラスをインスタンス化するのと同じ拡張ですか?

public class Pet { 
} 

public class Fish extends Pet { 
} 

私は魚のクラスにクラスペットを拡張する場合は、その同じですか?拡張は上にあり、インスタンスは下にあります。彼らは同じですか?

public class Pet { 
} 

public class Fish { 

Pet myPet = new Pet(); 
} 

+1

いいえ、それらは同じではありません。 OOPで継承されていることだけを少し読んでみる必要があります。 – alzee

+1

クラスを拡張するとき、最初のクラスの属性とメソッドを継承する別のクラス(サブクラス)を定義しています。クラスをインスタンス化すると、そのクラスの新しいオブジェクト(インスタンス)が作成されます。 あなたのコードでは、最初のケースでは、Fishという名前の新しいクラスを作成しています.Fishという名前のクラスでいくつかの共通のもの(継承)を持っています。そしてFishはPetのサブクラスです。また、Petと共通のものを持たないFishという名前が付いていますが、「ペット」という名前のmyPetという名前の属性があります。 –

+0

Googleのコンポジションと継承 – StaticBeagle

答えて

0

最初の例では、継承について説明します。それらは2つのOOPの概念です。プログラマは共通ロジックを再利用できます。あなたは継承よりもcomposiitonを使いたいと思うでしょう。他のSO answerから

コピー:

彼らは絶対に異なっています。継承は「is-a」関係です。 構成は「has-a」です。

あなたのクラスのフィールド として別のクラスCのインスタンスを持つ、代わりの 組成が継承よりもかなり良くなってきたでしょうC. A良い例を拡張することにより、構図を行うには、java.util.Stackを です現在、java.util.Vectorを拡張しています。これは今や と考えられています。スタックは "is-not-a"ベクトルです。要素を任意に挿入したり削除したりすることはできません。 代わりに組成が だったはずです。

残念ながら、 継承階層を変更すると、 既存コードとの互換性が失われるため、この設計ミスを修正するのは遅すぎます。スタックが継承の代わりに合成を使用していた場合は、 は常に APIに違反せずに別のデータ構造を使用するように変更できます。

は、私は非常にジョシュブロッホの本の効果的なJavaの第2版をお勧めします

項目16:継承を超える好意組成

項目17:設計および文書の継承のためまたは他の禁止、それ

良いオブジェクト指向 デザインは既存のクラスを自由に拡張することではありません。あなたの最初の 本能を代わりに作成する必要があります。

+0

これは基本的に同じですか?彼らは特定のクラスが別のクラスメソッドを使用できるようにするだけですか?だから、なぜ他のものを選ぶのですか?あなたが言っていることは、後で道路を編集する方が簡単なので、クラスをインスタンス化するのではなく、クラスをインスタンス化することです。 – Houzi88

+0

@ Houzi88引用の最初の行は「彼らは絶対に違います」と書かれています。 –

+0

@MeikVtune彼らは違っていますが、基本的には同じことをしていますよね? – Houzi88

0

彼らは同じではありません。最初の例で

は、継承と、Fishのインスタンスは、言語に応じて、this又はselfを介して、Petから継承されたものを含む、それ自身のプロパティとメソッドのすべてにアクセスすることができます。第2の例で

myPetPetクラスのインスタンスであることを起こるだけで可変であるが、PetFishは互いに関係がありません。

0

いいえ、完全に異なっています。

public class Fish extends Pet { }あなたは継承を使ってPetクラスをFishクラスに拡張します。つまり、FishはPetのサブクラスであり、Petクラスを継承します。

しかし、この1

public class Fish { 

Pet myPet = new Pet(); } 

にあなたはそれがペットであるクラスレベルのオブジェクトを持っているだけのことを、何から伸びていないので、あなたはペットを使用することができます魚と呼ばれる全く新しいオブジェクトを作成していますmyPetオブジェクトを介してオブジェクトメソッドの変数などに渡すことはできませんが、Fishはそれ自体のオブジェクトであり、Petのサブクラスではありません。

これは違いです。

ここではどちらを使うべきかについての一般的なルールは次のとおりです。クラスを拡張する場合、継承を使用する必要がありますが、その特定の関数用にクラスを使用する場合は、クラスの変数として。

+0

ありがとうございました! – Houzi88

+0

なぜ私はもう一方を選ぶでしょうか?彼らは技術的に同じことをしないのですか?与えられたクラスのメソッドを呼び出すだけでいいのですか? – Houzi88

+0

一般に、クラスを強化する場合は、継承を使用する方が良いですが、クラスを使用するだけの場合は、新しいオブジェクトを作成するという形でクラスを使用する方がよい – SteelToe

0

これらは全く異なっています。 extendは 'is-a'関係であり、後で(composition)は 'has-a'です。詳細はhereをご覧ください。

関連する問題