JavaRush /Blog Java /Random-VI /Thực hành sử dụng đa hình

Thực hành sử dụng đa hình

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta kết thúc loạt bài giảng về nguyên lý OOP . Trong bài học này chúng ta sẽ nói về tính đa hình. Thực hành sử dụng đa hình - 1Đa hình là khả năng xử lý nhiều loại như thể chúng là cùng một loại. Trong trường hợp này, hành vi của các đối tượng sẽ khác nhau tùy thuộc vào loại chúng thuộc về. Chúng ta hãy xem xét tuyên bố này chi tiết hơn. Hãy bắt đầu với phần đầu tiên: "khả năng làm việc với nhiều loại như thể chúng cùng loại". Làm thế nào các loại khác nhau có thể là một và giống nhau? Nghe có vẻ hơi lạ :/ Thực ra nó đơn giản thôi. Ví dụ, tình huống này phát sinh với việc sử dụng quyền thừa kế thông thường. Hãy xem nó hoạt động như thế nào. Giả sử chúng ta có một lớp cha đơn giản Catvới một phương thức duy nhất run()- “run”:
public class Cat {

   public void run() {
       System.out.println("Бег!");
   }
}
Bây giờ, hãy tạo ba lớp kế thừa từ Cat: Lion, TigerCheetah, biểu thị sư tử, hổ và báo gêpa.
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 км/ч");
   }
}
Vậy là chúng ta có 3 lớp. Hãy mô phỏng một tình huống mà chúng ta có thể làm việc với họ như thể họ học cùng một lớp. Hãy tưởng tượng rằng một trong những con mèo của chúng ta bị bệnh và cần sự giúp đỡ của bác sĩ Aibolit. Hãy thử tạo một lớp Aibolitcó thể chữa trị cho sư tử, hổ và báo gêpa.
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("Гепард здоров!");
   }
}
Có vẻ như vấn đề đã được giải quyết - lớp đã được viết và sẵn sàng sử dụng. Nhưng chúng ta sẽ làm gì nếu muốn mở rộng chương trình của mình? Bây giờ chúng ta chỉ có 3 loài: sư tử, hổ và báo gêpa. Nhưng có hơn 40 loài mèo trên thế giới. Hãy tưởng tượng điều gì sẽ xảy ra nếu chúng ta thêm vào chương trình các lớp riêng biệt dành cho mèo, báo đốm, mèo Maine, mèo nhà và mọi loài khác của Pallas. Thực hành sử dụng đa hình - 2Tất nhiên, bản thân chương trình sẽ hoạt động, nhưng lớp Aibolitsẽ phải liên tục bổ sung các phương pháp mới để điều trị từng loại mèo, và kết quả là nó sẽ phát triển đến quy mô chưa từng có. Đây là lúc đặc tính đa hình phát huy tác dụng - “khả năng làm việc với nhiều loại như thể chúng cùng loại”. Chúng ta không cần phải tạo ra vô số phương pháp có thể làm được điều tương tự - chữa trị cho con mèo. Một phương pháp sẽ đủ cho tất cả các trường hợp cùng một lúc:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
healCat()Chúng ta có thể truyền cả đối tượng LionTigerđối tượng cho phương thức Cheetah- tất cả đều là 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);
   }
}
Đầu ra của bảng điều khiển:

Пациент здоров!
Пациент здоров!
Пациент здоров!
Đây là cách lớp của chúng ta Айболитcó thể làm việc với các kiểu khác nhau như thể chúng cùng một kiểu. Bây giờ hãy giải quyết phần thứ hai: "trong trường hợp này, hành vi của các đối tượng sẽ khác nhau tùy thuộc vào loại chúng thuộc về." Mọi thứ ở đây cũng đơn giản. Trong tự nhiên, tất cả các con mèo đều chạy khác nhau. Tối thiểu, tốc độ chạy của họ khác nhau. Trong số ba thú cưng của chúng tôi, báo săn là loài nhanh nhất, trong khi hổ và sư tử chạy chậm hơn. Đó là, hành vi của họ là khác nhau. Tính đa hình không chỉ cho chúng ta khả năng sử dụng nhiều loại khác nhau làm một. Đồng thời, nó cho phép chúng ta không quên sự khác biệt của họ và duy trì hành vi cụ thể của từng người trong số họ. Điều này có thể được hiểu với ví dụ này. Giả sử sau khi hồi phục thành công, lũ mèo của chúng tôi quyết định chạy vòng quanh một chút để ăn mừng. Hãy thêm cái này vào lớp của chúng ta Aibolit:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
       cat.run();
   }
}
Hãy thử chạy cùng một đoạn mã để chữa trị cho ba con vật:
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);
}
Và đây là kết quả sẽ như thế nào:

Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
Ở đây, chúng tôi thấy rõ rằng hành vi cụ thể của các đối tượng của chúng tôi vẫn được giữ nguyên, mặc dù chúng tôi đã chuyển cả ba con vật vào một phương thức, “khái quát hóa” từng con vật thành Cat. Nhờ tính đa hình, Java nhớ hoàn hảo rằng đây không chỉ là ba con mèo, mà cụ thể là sư tử, hổ và báo săn, chúng chạy khác nhau. Đây là ưu điểm chính của việc sử dụng tính đa hình - linh hoạt . Khi chúng ta cần tạo ra một số chức năng chung cho nhiều loài, sư tử, hổ và báo gêpa chỉ đơn giản biến thành “mèo”. Tất cả các loài động vật đều khác nhau, nhưng trong một số trường hợp - mèo vẫn là mèo, bất kể nó thuộc loài nào :) Đây là video xác nhận dành cho bạn.
Khi việc “khái quát hóa” này không cần thiết, ngược lại chúng ta cần hành vi của các loài khác nhau thì mỗi loại lại hành xử khác nhau. Nhờ tính đa hình, bạn tạo một giao diện (tập hợp các phương thức) duy nhất cho nhiều lớp. Do đó, độ phức tạp của chương trình được giảm bớt. Ngay cả khi chúng tôi mở rộng chương trình lên 40 loại mèo, chúng tôi vẫn sẽ có giao diện đơn giản nhất có thể - một phương pháp run()cho tất cả 40 con mèo.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION