野球部に継承について説明したい

2023/08/11に公開

おはようございます!
今日もオブジェクト指向プログラミングシリーズで、「継承」と「オーバーライド」についての記事を書いていきたいと思います。

まずはそれぞれの言葉についての解説です。

継承とは

継承とは、既存のクラス(親クラス)から新しいクラス(子クラス)を作成することです。
子クラスは親クラスの属性やメソッドを引き継ぎます。これにより、コードの再利用が容易になり、プログラムの整理や拡張がしやすくなります。
継承を利用する主な目的は、既存のコードの再利用と、新しいクラスの迅速な実装です。これにより、開発時間の短縮やコードの保守性の向上が期待できます。

オーバーライドとは

オーバーライドとは、サブクラス(子クラス)でスーパークラス(親クラス)のメソッドを再定義することです。これにより、親クラスで定義された挙動を、子クラスで特有の挙動に変更することができます。

例えば、親クラスに「自己紹介する」というメソッドがあるとします。子クラスでは、この自己紹介の内容を特定の役割に応じて変更したい場合があります。その際にオーバーライドを使用すると、親クラスのメソッドをそのまま利用しつつ、子クラスで必要な部分だけを変更することができます。

オーバーライドのメリットは、コードの重複を減らし、柔軟なプログラムの構造を作ることができる点にあります。親クラスのメソッドを基本として、子クラスで特定の挙動を追加・変更することで、効率的にコードを整理し、拡張性と保守性を高めることができます。

https://zenn.dev/yoojiyang/articles/a56f17713e274e

以前に書いたこちらの記事では、選手クラスからインスタンス化して各選手のオブジェクトを作ることを考えてみましたが、今日は選手クラスから「継承」を使って投手クラスと野手クラスを作り、そこから各選手のインスタンスを作ってみたいと思います。

「継承」を理解することで、プログラムの設計やコードの読み書きがより効率的になります。
特に大規模なプロジェクトでは、これらの概念の適切な使用が非常に重要という事なので、頑張って理解していきましょう!

パワプロで考える「継承」

パワプロの選手のパラメータを思い出して下さい。
野手はポジションに関係なくミートやパワーなどパラメータは同じですが、投手はコントロールやスタミナといった別のパラメータが必要になります。一方で選手の名前や背番号といった共通したパラメータも存在します。
このような場合に、継承が役に立ちます。

ここでは、選手から投手と野手に分かれて、そこから各選手に分岐するというような階層構造でオブジェクトを作成してみたいと思います。

また、オーバーライドを説明するために自己紹介を行うintoroduceメソッドを追加しています。
使うメソッドは1種類ですが、誰がいうかによって内容が変わります。(=どのオブジェクトが使うかによって内容を変えることができます。)

// 選手クラスを定義
class Player {
  constructor(name, number) {
    this.name = name; // 選手名
    this.number = number; // 背番号
  }

  // 自己紹介メソッド
  introduce() {
    console.log(`私の名前は${this.name}、背番号は${this.number}です。`);
  }
}

// 選手クラスを「継承」した投手クラスを定義
class Pitcher extends Player {
  constructor(name, number, stamina, control, speed) {
    // 名前と背番号は選手クラスから引き継ぐ
    super(name, number);
    // 投手クラス特有のプロパティを追加
    this.stamina = stamina; // スタミナ
    this.control = control; // コントロール
    this.speed = speed; // 球速
  }

  // introduceメソッドをオーバーライド
  introduce() {
    console.log(`私の名前は${this.name}、背番号は${this.number}で、コントロールは${this.control}です。`);
  }
}

// 選手クラスを「継承」した野手クラスを定義
class Fielder extends Player {
  constructor(name, number, meet, power, run, throwing, fielding) {
    // 名前と背番号は選手クラスから引き継ぐ
    super(name, number);
    // 野手クラス特有のプロパティを追加
    this.meet = meet;
    this.power = power;
    this.run = run;
    this.throwing = throwing;
    this.fielding = fielding;
  }

  // introduceメソッドをオーバーライド
  introduce() {
    console.log(`私の名前は${this.name}、背番号は${this.number}で、ミートは${this.meet}です。`);
  }
}

const ishiiKazuhisa = new Pitcher('石井一久', 1, A, F, 15);
const furuta = new Fielder('古田敦也', 27, B, C, D, A, A);

// 同じintroduceメソッドで違う処理ができる
ishiiKazuhisa.introduce(); // 私の名前は石井一久、背番号は16で、コントロールはFです。
furuta.introduce(); // 私の名前は古田敦也、背番号は27で、ミートはBです。

もちろんです!以下、まとめ部分の作成を行います。

まとめ

今回の記事では、オブジェクト指向プログラミングの重要な概念である「継承」と「オーバーライド」について解説しました。

  1. 継承:親クラスの属性やメソッドを子クラスが引き継ぐことで、コードの再利用と整理、拡張が容易になります。例えば、野球の選手クラスから投手クラスと野手クラスを派生させることができます。

  2. オーバーライド:子クラスで親クラスのメソッドを再定義することで、特定の挙動を変更することができます。これにより、コードの重複を減らし、柔軟なプログラムの構造を作ることができます。

最後に、この記事が皆さんの学びに役立つことを願っています。
もし役立ったと感じたら、いいねやフォローをお願いします!

それでは今日も学習をスタートします!

Discussion