お疲れ様です!!
私事ですが、今日は結婚記念日でした!!
だからなんだという話ですが、
今日は、抽象クラスとポリモフィズムの勉強です!!
実は、この項目は昨日の最後にやったのですが、ちょっと理解ができなくて頭を抱えていました。
今日はとにかく分からんことを解決するという日にしました!!
ということでいきます!!
【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」になったりとか苦しんだ部分もありましたが、
ほとんど何も見ずになんとかやり切りました!!
結局、菅原先生の例とほとんど同じですがすごく嬉しかったです!!
ということで、明日も楽しんでいこう!!!