CodeGym/Blog Java/Ngẫu nhiên/Đa hình trong Java

Đa hình trong Java

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

   public void run() {
       System.out.println("Run!");
   }
}
Bây giờ chúng ta sẽ tạo ba lớp kế thừa Cat : Lion , TigerCheetah .
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Lion runs at 80 km/h");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Tiger runs at 60 km/h");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Cheetah runs at up to 120 km/h");
   }
}
Vậy là chúng ta có 3 lớp. Hãy lập mô hình tình huống mà chúng ta có thể làm việc với họ như thể họ là 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ị ốm và cần sự giúp đỡ của Tiến sĩ Dolittle. Hãy thử tạo một lớp Dolittle có thể chữa lành vết thương cho sư tử, hổ và báo.
public class Dolittle {

   public void healLion(Lion lion) {

       System.out.println("Lion is healthy!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Tiger is healthy!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Cheetah is healthy!");
   }
}
Có vẻ như vấn đề đã được giải quyết: lớp đã được viết và sẵn sàng hoạt động. Nhưng chúng ta sẽ làm gì nếu muốn kéo dài chương trình của mình? Chúng tôi hiện chỉ có 3 loại: sư tử, hổ và báo đốm. 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 tôi thêm các lớp riêng biệt cho manul, báo đốm Mỹ, Maine Coons, mèo nhà và tất cả những loài còn lại. Cách sử dụng đa hình - 2Tất nhiên, bản thân chương trình sẽ hoạt động, nhưng chúng ta phải liên tục thêm các phương thức mới vào lớp Dolittle để chữa bệnh cho từng loại mèo. Kết quả là, nó sẽ phát triển đến kích thước chưa từng thấy. Đây là lúc tính đa hình — "khả năng làm việc với một số loại như thể chúng là cùng một loại" — phát huy tác dụng. Chúng ta không cần phải tạo ra vô số phương pháp để làm điều tương tự — chữa lành vết thương cho một con mèo. Một phương pháp là đủ cho tất cả chúng:
public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
   }
}
Phương thứcealCat () có thể chấp nhận các đối tượng Lion , TigerCheetah — tất cả chúng đều là phiên bản của Cat :
public class Main {

   public static void main(String[] args) {

       Dolittle dolittle = new Dolittle();

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

       dolittle.healCat(simba);
       dolittle.healCat(shereKhan);
       dolittle.healCat(chester);
   }
}
Đầu ra bảng điều khiển: Bệnh nhân khỏe mạnh! Bệnh nhân khỏe mạnh! Bệnh nhân khỏe mạnh! Vì vậy, Dolittle của chúng tôilớp hoạt động với các loại khác nhau như thể chúng là cùng một loại. Bây giờ hãy giải quyết phần thứ hai: "hơn nữa, hành vi của các đối tượng sẽ khác nhau tùy thuộc vào loại của chúng". Tất cả đều rất đơn giản. Trong tự nhiên, mỗi con mèo chạy theo một cách khác nhau. Ở mức tối thiểu, chúng chạy ở các tốc độ khác nhau. Trong số ba con mèo của chúng tôi, con báo là nhanh nhất, trong khi hổ và sư tử chạy chậm hơn. Nói cách khác, hành vi của họ là khác nhau. Tính đa hình không chỉ cho phép chúng ta sử dụng các loại khác nhau làm một. Nó cũng cho phép chúng tôi nhớ sự khác biệt của chúng, duy trì hành vi cụ thể của từng người trong số chúng. Ví dụ sau đây minh họa điều này. Giả sử rằng những con mèo của chúng ta, sau khi phục hồi thành công, quyết định chạy một chút. Chúng tôi sẽ thêm phần này vào lớp Dolittle của chúng tôi:
public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
       cat.run();
   }
}
Hãy thử chạy cùng một mã để xử lý ba con vật:
public static void main(String[] args) {

   Dolittle dolittle = new Dolittle();

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

   dolittle.healCat(simba);
   dolittle.healCat(shereKhan);
   dolittle.healCat(chester);
}
Và đây là kết quả: Bệnh nhân khỏe mạnh! Sư tử chạy với tốc độ 80 km/h. Bệnh nhân khỏe mạnh! Tiger chạy với tốc độ 60 km/h. Bệnh nhân khỏe mạnh! Cheetah chạy với tốc độ lên tới 120 km/h Ở đây chúng ta thấy rõ rằng hành vi cụ thể của các đối tượng được giữ nguyên, mặc dù chúng ta đã chuyển cả ba con vật cho phương thức sau khi 'khái quát hóa' chúng thành Cat . Do tính đa hình, Java nhớ rõ rằng đây không chỉ đơn giản là ba con mèo bất kỳ. Chúng là một con sư tử, một con hổ và một con báo, mỗi con chạy khác nhau. Điều này minh họa ưu điểm chính của tính đa hình: tính linh hoạt. Khi chúng ta cần triển khai một số chức năng được chia sẻ bởi nhiều loại, thì sư tử, hổ và báo đốm chỉ đơn giản trở 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 là mèo, bất kể loài của nó là gì :) Đây là một số video xác nhận dành cho bạn.
Khi 'sự khái quát hóa' này là không mong muốn và thay vào đó chúng ta cần mỗi loài cư xử khác nhau, thì mỗi loại sẽ làm việc riêng của mình. Nhờ tính đa hình, bạn có thể tạo một giao diện (tập hợp các phương thức) duy nhất cho nhiều loại lớp. Điều này làm cho các chương trình ít phức tạp hơn. Ngay cả khi chúng tôi mở rộng chương trình để hỗ trợ 40 loại mèo, chúng tôi vẫn sẽ có giao diện đơn giản nhất: một phương thức run() duy nhất cho tất cả 40 con mèo.
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào