Tính đa hình trong Java được sử dụng trong công việc như thế nào?

Em chào các anh,em đang học đến phần Tính Đa Hình trong Java ,Có một điều em thắc mắc là tính đa hình này được áp đụng vào công việc sau này ntn ạ,e vẫn chưa hiểu công dụng của nó cho lắm .Mong các anh giải đáp thắc mắc cho em ạ.Em xin cảm ơn

Có phải bạn thắc mắc như này không ? Ví dụ ta có 1 Class Shape là class cha và 2 Class HinhTamGiac, HinhVuong là class con như sau:

public abstract class Shape 
{
    public abstract int tinhChuVi();
    public abstract void veHinh();
}
public class HinhTamGiac extends Shape
{
    @Override
    public int tinhChuVi() 
    {
        return 1;
        // Ở đây chỉ là ví dụ thôi
    }

    @Override
    public void veHinh() 
    {
        System.out.println("Tam Giac");
    }    
}
public class HinhVuong extends Shape
{
    @Override
    public int tinhChuVi() {
        return 2;
    }

    @Override
    public void veHinh() {
        System.out.println("Hinh Vuong");
    }    
}

Có phải nó rất dài không, tại sao lại phải viết thêm Class cha mà sao không viết hẳn luôn 2 class con ra ? :smile: Nhưng nếu bây giờ ta có một Class Controller nữa:

public class Controller 
{
    public static void main(String[] args) 
    {
        Shape[] list = new Shape[2];
        list[0] = new HinhTamGiac();
        list[1] = new HinhVuong();
        
        for(Shape shape : list)
        {
            printInfo(shape);
        }
    }
    public static void printInfo(Shape shape)
    {
        System.out.println("Chu vi: " + shape.tinhChuVi());
        shape.veHinh();
    }
}  

Nếu trong trường hợp này, bạn viết riêng 2 Class con ra thì tức là bạn sẽ phải viết từng void printInfo cho từng Class cụ thể. Đồng thời cùng phải tạo ra hai Array riêng để chứa từng loại ==> Quá dài dòng và phức tạp đúng không ?? Điều này rất bất tiện, mỗi khi có kiểu Shape mới bạn lại phải vào sửa, thêm phương thức trong Controller.java ==> Mất thời gian


Tính đa hình giúp cho các Class chỉ cần quan tâm đến đối tượng mình đang làm việc có thể làm được gì, chứ không quan tâm đó là cái gì :smile: Đây là một đặc điểm của OOP :wink:
Hy vọng giúp bạn hiểu được tác dụng của tính đa hình :smile:

6 Likes

em cảm ơn anh nhiều,…

1 Like

Nói theo cách đơn giản tính đa hình là cùng tên 1 phương thức nhưng tùy theo kiểu trả về hoặc số lượng tham số hoặc kiểu tham số sẽ cho ra các kết quả các khau.

  • Ví dụ:
    HienThi(“Hello world”) => Kết quả: Hiển thị chuỗi “Hello world” ra màn hình
    HienThi(“Hello world”, 10) => Kết quả: Hiển thị chuỗi “Hello world” ra màn hình trong vòng 10 giây.
    HienThi(“Hello world”, 10,…v…v)…

  • Nó làm đơn giản hóa cách mà người dùng thao tác với đối tượng.

  • Có thể thay thế tính đa hình bằng cách đặt giá trị mặc định cho tham số và xử lý các kiểu theo từng cách khác nhau. Nhưng cách này không khuyến khích vì quá nhiều code trong một phương thức khó bảo trì và quản lý sau này.

Mình thấy ví dụ và giải thích hơi khó hiểu.
Kết luận thì oke =))

1 Like

Dễ hiểu mà, đúng bản chất của tính đa hình đó

Đa hình trong Java hiểu đơn giản tạo một abstract class hay interface để tạo phần khung (base). Các class muốn dựa vào khung đó chỉ cần extends abstract class / implement interface rồi override lại abstract method theo ý muốn

VD như việc vẽ hình (base), ta có nhiều hình (hình chữ nhật, tam giác, tròn,…) Thay vì tạo một đống class HinhChuNhat, HinhTamGiac, HinhTron với các method tinhChuVi(), veHinh() rồi copy, sửa lại method, có thể sai sót như sai cấu trúc, không dùng được Generic để tạo List các hình (Hình Chữ Nhật, Hình Tròn, Hình Tam Giác chung vào list Hình chẳng hạn) . Tính đa hình sẽ giúp hạn chế sai sót, sử dụng được Generic để tạo list có chung 1 kiểu

Mục đích chính là để tạo sự mềm dẻo trong chương trình, hạn chế duplicate code, tạo sự thống nhất trong code, nhất là khi teamwork, không có các base class rất dễ sai sót, bug không mong muốn

Hồi xưa anh học Java hay duplicate code lắm, từ ngày đi làm mới hiểu được tính đa hình nó áp dụng nhiều lắm, project nào cũng đòi phải xử lý Generic cả

4 Likes

Cái này là định nghĩa overload cơ mà :smiley:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?