CodeGym /Blog Java /Ngẫu nhiên /Các phương thức mặc định trong giao diện

Các phương thức mặc định trong giao diện

Xuất bản trong nhóm
Mọi phiên bản Java mới đều khác với những phiên bản trước đó. Đây là một ví dụ về những thay đổi trong tài liệu mà chúng tôi đã đề cập: trước Java 5, ngôn ngữ không có enums. Các phương thức mặc định trong giao diện - 1Tương tự, Java 8 khác biệt rõ rệt so với Java 7. Hầu hết các bài học của chúng tôi được viết cho phiên bản thứ 7 của ngôn ngữ này, nhưng tất nhiên chúng tôi sẽ không bỏ qua những đổi mới quan trọng. Vì chúng ta đã nói về giao diện trong bài học này, nên chúng ta sẽ xem xét một bản cập nhật — các phương thức mặc định trong giao diện . Bạn đã biết rằng một giao diện không thực hiện hành vi . Nhiệm vụ của nó là mô tả hành vi mà tất cả các đối tượng thực thi nó phải có.. Nhưng các nhà phát triển thường xuyên gặp phải các tình huống trong đó việc triển khai một phương thức giống nhau trong tất cả các lớp. Hãy xem xét ví dụ về chiếc ô tô cũ của chúng ta:

public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
"Theo ý kiến ​​của bạn, vấn đề chính với mã này là gì? Bạn có thể nhận thấy rằng chúng tôi đã viết một loạt mã lặp đi lặp lại! Vấn đề này phổ biến trong lập trình và bạn cần tránh nó. Đó là một vấn đề khác mà các giải pháp cụ thể không tồn tại trước đây Java 8 đã được phát hành. Với phiên bản này, khả năng chỉ định các phương thức mặc định và triển khai chúng ngay bên trong giao diện! Đây là cách bạn thực hiện điều đó:

public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Giờ đây, các phương thức gas()brake()giống nhau cho tất cả các ô tô đã được chuyển sang giao diện. Không cần mã lặp lại. Hơn nữa, các phương thức có sẵn trong mỗi lớp!

public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Điều gì sẽ xảy ra nếu có 100 lớp có gas()phương thức nhưng chỉ 99 lớp có cùng hành vi? Điều đó có làm hỏng mọi thứ và làm cho phương pháp mặc định không phù hợp với tình huống này không? Tất nhiên là không :) Các phương thức mặc định trong giao diện có thể được ghi đè giống như các phương thức thông thường.

public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car decelerates differently!");
   }
}
Tất cả 99 loại ô tô khác sẽ thực hiện phương pháp mặc định vàUnusualCarlớp, là một ngoại lệ, sẽ không làm hỏng bức tranh tổng thể và bình tĩnh xác định hành vi của chính nó. Đa kế thừa các giao diện. Như bạn đã biết, Java không hỗ trợ đa kế thừa. Có nhiều lý do cho việc này. Chúng ta sẽ xem xét chúng một cách chi tiết trong một bài học riêng biệt. Các ngôn ngữ khác, chẳng hạn như C++, hỗ trợ nó. Nếu không có nhiều kế thừa, một vấn đề nghiêm trọng sẽ phát sinh: một đối tượng có thể có một số đặc điểm và 'hành vi' khác nhau. Đây là một ví dụ từ cuộc sống: chúng ta là con cái đối với cha mẹ, học sinh đối với giáo viên và bệnh nhân đối với bác sĩ. Trong cuộc sống, chúng ta đảm nhận những vai trò khác nhau và theo đó, cư xử khác nhau: rõ ràng, chúng ta sẽ không nói chuyện với giáo viên giống như cách chúng ta nói chuyện với những người bạn thân của mình. Hãy thử dịch mã này thành mã. Hãy tưởng tượng rằng chúng ta có hai lớp: Ao và Aviary. Đối với ao, chúng ta cần thủy cầm; đối với chuồng chim, chúng ta cần những con chim biết bay. Để làm điều này, chúng tôi đã tạo hai lớp cơ sở:FlyingBirdWaterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Theo đó, chúng tôi sẽ gửi những con chim có lớp kế thừa FlyingBirdđến chuồng chim và chúng tôi sẽ gửi những con kế thừa Waterfowlđến ao. Tất cả dường như rất đơn giản. Nhưng chúng ta gửi một con vịt ở đâu? Nó bơi và bay. Và chúng tôi không có nhiều kế thừa. May mắn thay, Java hỗ trợ triển khai nhiều giao diện. Mặc dù một lớp không thể kế thừa nhiều lớp cha, nhưng nó có thể dễ dàng thực hiện một số giao diện! Vịt của chúng ta có thể vừa là chim bay vừa là chim nước :) Chúng ta chỉ cần tạo FlyingBirdWaterfowlgiao diện chứ không phải lớp để đạt được kết quả mong muốn.

public class Duck implements FlyingBird, Waterfowl {

   // The methods of both interfaces can be easily combined into one class

   @Override
   public void fly() {
       System.out.println("Fly!");
   }

   @Override
   public void swim() {

       System.out.println("Swim!");
   }
}
Theo đó, chương trình của chúng tôi giữ lại tính linh hoạt của các lớp và kết hợp với các phương thức mặc định, khả năng xác định hành vi của các đối tượng của chúng tôi trở nên gần như vô hạn! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION