JavaRush /Java Blog /Random-TW /使用多態性的實踐

使用多態性的實踐

在 Random-TW 群組發布
你好!今天我們即將完成一系列關於OOP原理的講座。在本課中,我們將討論多態性。 使用多態性的實踐—1多態性是指將多種類型視為相同類型的能力。在這種情況下,物件的行為將根據它們所屬的類型而有所不同。 讓我們更詳細地看看這個聲明。讓我們從第一部分開始:“處理多種類型的能力,就好像它們是同一類型一樣。” 不同的類型怎麼可能是同一種呢?聽起來有點奇怪:/其實很簡單。例如,這種情況是在正常使用繼承時出現的。讓我們看看它是如何工作的。假設我們有一個簡單的父類,Cat只有一個方法run()- “run”:
public class Cat {

   public void run() {
       System.out.println("Бег!");
   }
}
現在讓我們創建三個繼承於Cat: LionTiger和的類Cheetah,分別表示獅子、老虎和獵豹。
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Лев бежит со speedю 80 км/ч");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Тигр бежит со speedю 60 км/ч");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Гепард бежит со speedю до 120 км/ч");
   }
}
所以我們有3節課。讓我們模擬一種情況,我們可以像他們是同一類一樣與他們一起工作。讓我們想像一下,我們的一隻貓生病了,需要艾博利特醫生的幫助。讓我們試著創造一個Aibolit能夠治療獅子、老虎和獵豹的類別。
public class Aibolit {

   public void healLion(Lion lion) {

       System.out.println("Лев здоров!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Тигр здоров!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Гепард здоров!");
   }
}
看起來問題已經解決了——類別已經寫完畢並且可以使用了。但如果我們想擴展我們的計劃,我們該怎麼辦?現在我們只有3個物種:獅子、老虎和獵豹。但世界上有40多種貓。想像一下,如果我們在程式中為帕拉斯貓、美洲虎、緬因貓、家貓和其他貓添加單獨的類別,會發生什麼。 使用多態性的實踐—2當然,程序本身會起作用,但班級Aibolit必須不斷添加新的方法來治療每種類型的貓,結果它將增長到前所未有的規模。這就是多態性的特性發揮作用的地方——“處理多種類型的能力,就好像它們是同一類型一樣。” 我們不需要創造無數的方法來做同樣的事情——治療貓。一種方法足以同時滿足所有情況:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
healCat()我們可以將物件LionTiger物件傳遞 給該方法Cheetah- 它們都是Cat
public class Main {

   public static void main(String[] args) {

       Aibolit aibolit = new Aibolit();

       Lion simba = new Lion();
       Tiger sherekhan = new Tiger();
       Cheetah chester = new Cheetah();

       aibolit.healCat(simba);
       aibolit.healCat(sherekhan);
       aibolit.healCat(chester);
   }
}
控制台輸出:

Пациент здоров!
Пациент здоров!
Пациент здоров!
這就是我們的類別Айболит可以處理不同類型的方式,就好像它們是同一類型一樣。現在讓我們處理第二部分:“在這種情況下,對象的行為將根據它們所屬的類型而有所不同。” 這裡的一切也都很簡單。在自然界中,所有貓的奔跑方式都不同。至少,他們的跑步速度是不同的。在我們的三種寵物中,獵豹跑得最快,而老虎和獅子跑得較慢。也就是說,他們的行為是不同的。多態性不僅使我們能夠將不同的類型合而為一。同時,它使我們不會忘記他們的差異,並保留他們每個人特有的行為。透過這個例子就可以理解這一點。假設在成功康復後,我們的貓決定跑來跑去慶祝一下。讓我們將其添加到我們的類別中Aibolit
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
       cat.run();
   }
}
讓我們嘗試運行相同的程式碼來治療三種動物:
public static void main(String[] args) {

   Aibolit aibolit = new Aibolit();

   Lion simba = new Lion();
   Tiger sherekhan = new Tiger();
   Cheetah chester = new Cheetah();

   aibolit.healCat(simba);
   aibolit.healCat(sherekhan);
   aibolit.healCat(chester);
}
結果如下:

Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
在這裡,我們清楚地看到,儘管我們將所有三種動物傳遞到一個方法中,並將它們「概括」為 ,但我們的物件的特定行為被保留了Cat。由於多態性,Java 完美地記住了這不僅僅是三隻貓,而是一隻獅子、一隻老虎和一隻獵豹,它們的奔跑方式不同。這是使用多態性的主要優點——彈性。當我們需要創造一些多種類型共有的功能時,獅子、老虎和獵豹就會變成「貓」。所有動物都是不同的,但在某些情況下 - 貓就是貓,無論它屬於什麼物種:) 這是為您提供的視頻確認。
當不需要這種“概括”,相反我們需要物種的行為不同時,每種類型的行為都不同。由於多態性,您可以為各種類別建立單一介面(方法集)。因此,程序的複雜性降低了。即使我們將程式擴展到 40 種貓,我們仍然會擁有最簡單的介面 - 一種方法run()適用於所有 40 種貓。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION