私はJavaを学んでいて、どのような状況でクラスを拡張したいのか疑問に思っていました:
http://5upcodes.blogspot.fi/2013/08/java-inheritance.html
ありがとう!
私はJavaを学んでいて、どのような状況でクラスを拡張したいのか疑問に思っていました:
http://5upcodes.blogspot.fi/2013/08/java-inheritance.html
ありがとう!
スーパー クラス (拡張されるクラス) とほぼ同じクラスを作成する場合は、それを拡張してカスタマイズします。その機能の一部を上書きしたり、機能を追加したりします。
これは「is-a」シナリオであり、OOP の 3 つの柱 (継承、カプセル化、ポリモーフィズム) の 1 つです。Animal クラスがある場合は、Animal クラスから Dog クラスを拡張することができます。犬は動物ですが、その逆ではありません。すべての動物には細胞がありますが、犬にはそれ以外の機能があります。それはそれのかなり基本的な考えでしょう。
単純な理由で、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()
}
両方の車両にエンジンが搭載されていますが、一方はタイヤを使用して移動し、もう一方はプロペラを使用して移動するため、モードが異なります。
そのため、メソッドエンジンのコードを書き直すことを避けるために、サブクラスに継承しました。うまくいけば、これが役に立ちます!
OOP のグッド プラクティスはprogram towards interfaces
です。ただし、場合によっては、継承を利用できます。たとえば、最上位クラスに明確に定義された動作 (具体的なコードを意味します) があり、すべての子クラスがそれを継承する場合、これによりコードと複雑さが軽減され、メンテナンスが改善されます。シナリオ。
一方、モデルが抽象的すぎる (基本的な動作があまり明確でない) 場合は、インターフェイスの使用を検討する必要があります。
また、実際のソフトウェアを作成している場合は、設計パターンを忘れないでください。誰かが既に問題を解決している可能性があります。
継承を使用する主な理由は、基本クラスの動作を拡張することです。
たとえば、ビデオ ゲームを作成している場合Character
、キャラクターが世界をナビゲートし、その他のことを行うために必要なすべてのコードを含むクラスがあるとします。
次に、 と を拡張Character
しPlayer
てNPC
、Player
(プレイヤー キャラクターを表す) には、ゲームをプレイする人が自分のキャラクターを制御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
か、継承によるものであるかに関係なく) NPC
。Character
更新された動作があります。
クラスの拡張は、インターフェースと並んで OOP の基本の 1 つです。建物と呼ばれる一般的なクラスがあるとしましょう。エリア、建物がある都市(または座標)などのメンバーがあります。
これで、extend を使用して、家を「Cottage」、「SkyScraper」などに指定できます。これらには、親の機能とそれ以上の機能 (たとえば、SkyScraper のレベル数) があります。
ほとんどは決してない。積極的に設計されたクラスのみを拡張することをお勧めします。ほとんどのクラス実装者は、人々がクラスを拡張した場合に何が起こるかについて何も考えていません。あらゆる種類の問題があります。
構成はあなたの親友です。
脆弱性には次のものがあります。
Josh Bloch は、彼の優れた著書『Effective Java, 2nd Edition』の中で、項目 8、16、および 17 を含むいくつかの場所でこれについて語っています。