0

私はJavaを学んでいて、どのような状況でクラスを拡張したいのか疑問に思っていました:

http://5upcodes.blogspot.fi/2013/08/java-inheritance.html

ありがとう!

4

12 に答える 12

4

スーパー クラス (拡張されるクラス) とほぼ同じクラスを作成する場合は、それを拡張してカスタマイズします。その機能の一部を上書きしたり、機能を追加したりします。

于 2013-08-23T17:50:32.547 に答える
3

これは「is-a」シナリオであり、OOP の 3 つの柱 (継承、カプセル化、ポリモーフィズム) の 1 つです。Animal クラスがある場合は、Animal クラスから Dog クラスを拡張することができます。犬は動物ですが、その逆ではありません。すべての動物には細胞がありますが、犬にはそれ以外の機能があります。それはそれのかなり基本的な考えでしょう。

于 2013-08-23T17:52:15.153 に答える
2

単純な理由で、1 つのクラスを別の 2 つのクラスに拡張し、基本は INHERITANCE と呼びます。

たとえば、Car と Boat という 2 つの車両クラスがあり、一部を除いて同様のプロパティを持つプログラムを作成したいとします。

public class Vehicle
{
  void engine()
}

protected class Car extends Vehicle
{
 void tyres()
}

protected class Boat extends Vehicle
{
 void propeller()
}

両方の車両にエンジンが搭載されていますが、一方はタイヤを使用して移動し、もう一方はプロペラを使用して移動するため、モードが異なります。

そのため、メソッドエンジンのコードを書き直すことを避けるために、サブクラスに継承しました。うまくいけば、これが役に立ちます!

于 2013-08-23T19:13:55.677 に答える
2

OOP のグッド プラクティスはprogram towards interfacesです。ただし、場合によっては、継承を利用できます。たとえば、最上位クラスに明確に定義された動作 (具体的なコードを意味します) があり、すべての子クラスがそれを継承する場合、これによりコードと複雑さが軽減され、メンテナンスが改善されます。シナリオ。

一方、モデルが抽象的すぎる (基本的な動作があまり明確でない) 場合は、インターフェイスの使用を検討する必要があります。

また、実際のソフトウェアを作成している場合は、設計パターンを忘れないでください。誰かが既に問題を解決している可能性があります。

于 2013-08-23T18:02:44.073 に答える
1

継承を使用する主な理由は、基本クラスの動作を拡張することです。

たとえば、ビデオ ゲームを作成している場合Character、キャラクターが世界をナビゲートし、その他のことを行うために必要なすべてのコードを含むクラスがあるとします。

次に、 と を拡張CharacterPlayerNPCPlayer(プレイヤー キャラクターを表す) には、ゲームをプレイする人が自分のキャラクターを制御NPCできるようにするロジックが含まれ、(非プレイヤー キャラクターを表す) には、コンピューターが他のキャラクターを制御できるようにするロジックが含まれます。文字。このようにして、すべてのキャラクターのすべてのロジック コアがCharacterクラスにカプセル化され、サブクラスには特定の動作を拡張するために必要なロジックのみが含まれます。

たとえば、Characterクラスに移動用のメソッドがあるとします。

protected void MoveToLocation(x, y)
{
 //movement logic goes here
}

そして、Playerクラスには、クリックされた場所にプレーヤーを移動するための mouselistener が含まれる場合があります。

public void mouseClicked (MouseEvent mouseEvent)
{
    MoveToLocation(mouseEvent.getX(), mouseEvent.getY());
}

そしてNPC、どうにかして自分でそれを理解します

protected void decideWhereToGo()
{
    int destinationX, destinationY;
    //logic for determining destination
    MoveToLocation(destinationX, destinationY);
}

どちらも から継承しCharacterているため、どちらも方法を知っておりMoveToLocation、その方法を変更したい場合は、コードを 1 か所で変更するだけで済みますCharacter(継承によるものであるPlayerか、継承によるものであるかに関係なく) NPCCharacter更新された動作があります。

于 2013-08-23T18:02:52.507 に答える
1

クラスの拡張は、インターフェースと並んで OOP の基本の 1 つです。建物と呼ばれる一般的なクラスがあるとしましょう。エリア、建物がある都市(または座標)などのメンバーがあります。

これで、extend を使用して、家を「Cottage」、「SkyScraper」などに指定できます。これらには、親の機能とそれ以上の機能 (たとえば、SkyScraper のレベル数) があります。

于 2013-08-23T17:52:52.447 に答える
-2

ほとんどは決してない。積極的に設計されたクラスのみを拡張することをお勧めします。ほとんどのクラス実装者は、人々がクラスを拡張した場合に何が起こるかについて何も考えていません。あらゆる種類の問題があります。

構成はあなたの親友です。

脆弱性には次のものがあります。

  • サブクラスで equals() または hashCode() を正しく実装できなくなりました
  • カプセル化に違反しており、別のクラスの内部構造に依存しています
  • 親クラスの変更に対して脆弱です
  • 親クラスに追加される新しいメソッドを受け入れる必要があります
  • 微妙なバグにつながる可能性がある Liskov Substitution Principle について心配する必要があります

Josh Bloch は、彼の優れた著書『Effective Java, 2nd Edition』の中で、項目 8、16、および 17 を含むいくつかの場所でこれについて語っています。

于 2013-08-23T17:49:24.267 に答える