野球部にクラスとインスタンスとコンストラクタを説明したい

2023/08/08に公開

おはようございます!
今日も昨日に引き続いてオブジェクト指向プログラミングについての記事です。

https://zenn.dev/articles/8cef7446cbe33f/edit

こちらのオブジェクトシリーズ第1回の記事も良かったら読んでみてください!

軽く昨日の復習をすると、オブジェクト指向プログラミングの”オブジェクト”とは?という話でした。
そして、オブジェクトは”プロパティ”と”メソッド”から構成されるものでしたね。

- オブジェクト: その「もの」の特性(プロパティ)と振る舞い(メソッド)を一つにまとめたものです。
- プロパティ: オブジェクトの特性や属性を表します。
- メソッド: オブジェクトの動作を表します。

今日は、”クラス”、”インスタンス”、”コンストラクタ”という3つの言葉について説明していきたいと思います!

パワプロで考える”クラス”、”インスタンス”、”コンストラクタ”

まずはこの3つの言葉の意味を説明します。

  • クラス : オブジェクト指向プログラミングにおける設計図のようなもの
  • インスタンス : クラスから生成される具体的なオブジェクト
  • コンストラクタ : メソッドの一種で、インスタンス生成時にプロパティの初期化を行うもの

これらをパワプロ的に考えていきましょう。

昨日はイチローオブジェクトを例にして考えましたが、パワプロには12球団の選手+OB選手のデータがあるので、全ての選手のコードを書くのはかなり大変です。そこで役に立つのが今日のテーマです。まずコードにするとどんな感じなのかをみていただいた後に、それぞれの言葉について順番に説明します。

// 選手クラスを定義
クラス 選手クラス = {
    // コンストラクタを使って、プロパティを初期化
    コンストラクタ (名前,ポジション,ミート,パワー,走力,肩力,守備力) {
    this.名前;,
    this.ポジション;,
    this.ミート;,
    this.パワー;,
    this.走力;,
    this.肩力;,
    this.守備力;,
    // 以下が選手クラスのメソッド
    バッティング : function() {
        ミートカーソルの大きさが${this.ミート}で、打球の強さは${this.パワー}に比例する。;
    },
    守備 : function() {
        ${走力}の速さで操作できて、投げる強さは${肩力}に比例して、エラーするかどうかは${守備力}に比例する;
    },
};

// 各選手を選手クラスのインスタンスとして生成
const イチローオブジェクト = new 選手クラス("イチロー", 外野手, A, B, A, A, A);
const 松井稼頭央オブジェクト = new 選手クラス("松井稼頭央", ショート, B, A, A, A, B);

クラス

”クラス”は共通の特性(プロパティ)や振る舞い(メソッド)を1つにまとめた設計図のようなものです。

例えば昨日のイチローオブジェクトでいくと、
「プロパティ」は"選手名、ミート、パワー、走力、肩力、守備力"にあたり、
「メソッド」は実際にゲームで使った時の能力にあたります。

このイチローオブジェクトの上位概念としての「選手クラス」というものを作ることで、他の選手も同じプロパティとメソッドを持って生成することが出来ます。

インスタンス

クラスという設計図をもとにして生成されたオブジェクトのことを”インスタンス”と言います。
上記のコードでいうと、イチローオブジェクトや松井稼頭央オブジェクトは選手クラスのインスタンスです。昨日のコードに比べてかなりスッキリしていますね!

インスタンスの生成方法は、

const オブジェクト名 = new クラス名(パラメータ)

となり、上記のコードでは一番下の行で書かれています。
新しいオブジェクト名を宣言し、new + クラス名 + パラメータで簡単に生成できます。
そこのようにコードを短縮できるのは、次に説明するコンストラクタという機能でプロパティを初期化してくれているからです。

コンストラクタ

コンストラクタは上記のコードでは4行目からスタートしています。
役割は、クラスからインスタンスを生成する際に、そのインスタンスのプロパティを初期化する役割を果たします。具体的には、コンストラクタ内で定義されたパラメータ(引数)を使って、インスタンスのプロパティに初期値を設定します。

例えば、パワプロの選手クラスで考えると、選手ごとに名前やポジション、ミート、パワーなどの能力値が異なります。これらの値をインスタンス生成時に設定するために、コンストラクタを使用します。

コンストラクタ (名前, ポジション, ミート, パワー, 走力, 肩力, 守備力) {
    this.名前 = 名前;
    this.ポジション = ポジション;
    this.ミート = ミート;
    this.パワー = パワー;
    this.走力 = 走力;
    this.肩力 = 肩力;
    this.守備力 = 守備力;
}

このコンストラクタは、新しい選手インスタンスを生成する際に、各プロパティに引数として渡された値を設定します。このようにして、同じ選手クラスから異なるプロパティ値を持つインスタンスを効率的に生成することができます。

まとめ

  1. クラス: オブジェクトの設計図で、共通のプロパティとメソッドを定義します。パワプロでいうと、選手の共通の特性と能力をまとめたものです。
  2. インスタンス: クラスから生成される具体的なオブジェクト。各選手がインスタンスになります。
  3. コンストラクタ: インスタンス生成時にプロパティを初期化するメソッド。選手の名前や能力値などを設定します。

これらの概念を理解することで、オブジェクト指向プログラミングの基本的な部分のイメージが掴めると嬉しいです。パワプロの例を通して、プログラミングの抽象的な概念を具体的にイメージすることができたのではないでしょうか。

最後に、この記事が役立ったと感じた方は、いいねやフォローをお願いします!

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

Discussion