class Instrument2 { void play(Note2 n) {} }
class Wind2 extends Instrument2 { void play(Note2 n) {} }
class Stringed2 extends Instrument2 { void play(Note2 n) {} }
class Brass2 extends Instrument2 { void play(Note2 n) {} }
static void tune(Wind2 i) { i.play(Note2.middleC); }
static void tune(Stringed2 i) { i.play(Note2.middleC); }
static void tune(Brass2 i) { i.play(Note2.middleC); }
// 每新增一種樂器,必須新增一個 tune() 重載!
class Instrument { void play(Note n) {} }
class Wind extends Instrument { void play(Note n) { println("Wind.play()"); } }
static void tune(Instrument i) { i.play(Note.middleC); } // 單一方法服務所有衍生類
tune(new Wind()); // 向上轉型自動發生
「讓代碼只與基類打交道,忽略具體衍生類。」
多態讓這成為可能:tune()見Instrument,實際調用Wind.play()。新增Stringed/Brass時,tune()完全不用動。
過程式思維習慣「具體類型具體處理」。多態要求思維轉型:面向接口編程,信任動態綁定。這是 OOP 入門最大心法關卡。