22日目(2025.02.21) 抽象クラス・ポリモフィズム


お疲れ様です!!

私事ですが、今日は結婚記念日でした!!

だからなんだという話ですが、
今日は、抽象クラスとポリモフィズムの勉強です!!

実は、この項目は昨日の最後にやったのですが、ちょっと理解ができなくて頭を抱えていました。
今日はとにかく分からんことを解決するという日にしました!!

ということでいきます!!



【2種類の継承】

まず、菅原先生は継承には2種類あるということを説明してくださいました。

①スーパークラスを元にサブクラスを作る
これは前にやったやつですね!!

②サブクラスを元にスーパークラスを作る
サブクラスの共通点をまとめて、スーパークラスを作るというやつで、ここでまずは「抽象クラス・抽象メソッド」が出てきました。

「クラブ」というクラスに「陸上部」「サッカー部」というサブクラスを作る場合、
陸上部とサッカー部クラスには、全く同じ共通のメソッドがあります。
(display()メソッド)
そして、メソッド名は同じだけど、処理内容が違うメソッドがあります。
(トレーニング名を記述するpractice()メソッド)

クラブクラスでは、display()メソッドは陸上部もサッカー部も内容が同じなので、そのまま継承できるけど、practice()メソッドは、内容が違うのでそのまま継承できない、、、

そんな時に出てきたのが「抽象メソッド」でした!!

abstract void practice();

とすることで、各クラブで記述した内容に基づいて、出力されるという訳でした!!
そして、抽象メソッドを使ったクラスは「抽象クラス」とされ、冒頭のクラス名のところに
public abstract Club{
といった形で、abstractを明記する必要があるということです!!

ここまではオッケー!!

そして、問題はコード例のところ、、、

public class Student {
private String name;
private Club club;

public Student(String name,Club club) {
    this.name = name;
    this.club = club;

}

public void display() {
    System.out.println("名前: " + name);
    club.display();
}

public void practice() {
    club.practice();
}
}

public abstract class Club {

private String name;

public Club(String name){
    this.name = name;
}

public void display() {
    System.out.println("部活動: " + name);
}

public abstract void practice() ;

}

public class TandF extends Club {

public TandF(String name) {
    super(name);

}

public void practice() {
    System.out.println("ウォ―ムアップ");
    System.out.println("インターバル");
    System.out.println("筋肉トレーニング");
}
}

public class Football extends Club {
public Football(String name) {
super(name);
}

public void practice() {
    System.out.println("ドリブル練習");
    System.out.println("シュート練習");
    System.out.println("ミニゲーム");
}
}

public class main {
public static void main(String[] args) {    

    TandF taf = new TandF("陸上競技部");
    Football fb = new Football("サッカー部");

    Student stu1 = new Student("菅原", taf);
    stu1.display();
    stu1.practice();

    Student stu2 = new Student("桜井", fb);
    stu2.display();
    stu2.practice();

}
}



どこで「??」となったかというと、
Studentクラスの
private Club club;
です。。。

え?継承してないのに、Clubクラスのメソッドを呼び出せるの!?
これなんのためにやってるの??

などなど、本当に訳が分からなくなりました、、、

YouTubeのコメント欄でも同じところで「?」になっている人はいたものの、それに対する菅原先生の返信を見ても「?」が取れず、、、

頭から完全に湯気が出てきました。。。

そんな感じだったので昨日は投稿をしなかったのですが、今日、色々調べたり、AI先生に聞いたりでついに謎が解けました!!

Club club

はズバリ、「コンポジション」というテクニックでした!!

コンポジションは「has – a」の形(継承は、is – a)で、
○○は△△を持っている
ということを表すもの。

なので、今回の場合、
StudentメソッドはClubクラスの情報を持っている(StudentにはClubが入っている)ということを表していて、参照ができるとのこと。
これはパッケージが違うクラスでもできるみたいです!!(privateメソッドやprotectedメソッドは不可)

スッキリした―!!!

というわけで、自分で理解度チェックをしようとお題を考えてコーディングしました!!

(お題)
人ごとに食べたものとそのカロリーを表示させる。
※今回習ったことを使って




できました!!
エラーやら、カロリーの数字が何をやっても「0」になったりとか苦しんだ部分もありましたが、
ほとんど何も見ずになんとかやり切りました!!


結局、菅原先生の例とほとんど同じですがすごく嬉しかったです!!


ということで、明日も楽しんでいこう!!!

コメントを残す