首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

為什麼要向上轉型?避免為每個衍生類寫重載方法的噩夢

     編輯:Java 相關知識

不向上轉型的代價:Music2 反面教材

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() 重載!

弊端

  1. 重複代碼爆炸:每類型一個方法。
  2. 維護噩夢:修改邏輯需改所有重載。
  3. 易漏寫:忘記某類型重載,編譯器不報錯,運行期出錯。
  4. 擴展封閉:違反開閉原則。

向上轉型的優雅:Music 正解

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 入門最大心法關卡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved