2011-01-20 30 views
5

Như chúng ta biết rằng chúng ta chỉ có thể khai báo chữ ký phương thức và cũng không thể tạo ra thể hiện của Giao diện. thì tại sao chúng ta cần giao diện. Tải không cần thiết vào JVM. Đây cũng là một sự suy giảm hiệu suất. Chúng tôi đang tạo giao diện và một số lớp triển khai giao diện đó và xác định tất cả các phương thức của giao diện. Trên thực tế những gì chúng tôi đã đạt được từ giao diện này. Bạn có thể vui lòng cho tôi một số ví dụ.lý do tại sao chúng ta cần giao diện thay vì lớp và những gì chúng ta đang đạt được từ giao diện

+1

bản sao có thể có của [Java: giao diện/lớp trừu tượng/phương pháp trừu tượng] (http://stackoverflow.com/questions/2124951/java-interface-abstract-classes-abstract-method) –

Trả lời

9

Giao diện là bạn đang buộc khách hàng của bạn thực hiện một số điều cụ thể, việc triển khai sẽ được giữ nguyên cho khách hàng. Ngoài ra java không hỗ trợ đa thừa kế bằng cách mở rộng nhiều lớp mà bạn có thể triển khai nhiều giao diện.

Ví dụ: List tuyên bố phương thức add(..) tất cả việc triển khai Danh sách đều cung cấp triển khai.

Đơn giản sẽ là.

Bạn xác định Giao diện Animal và phương thức speak() có nghĩa là tất cả Động vật phải nói chuyện với các triển khai khác nhau khác nhau. Con người sẽ nói, Chó sẽ sủa, Sư tử sẽ gầm lên.

Tại sao chúng ta nên tạo lớp học Thêm động vật. Chúng ta có thể khai báo lời nói() trong mỗi lớp. Điều gì là phù hợp chúng ta sẽ nhận được từ lớp Animal và thực hiện nói() trong tất cả các lớp phụ. Tuy nhiên tôi đã không nhận khái niệm này

lợi thế chính là kế thừa và đa hình [khái niệm cốt lõi của OOP]

Bạn đang định hành vi động vật ở đây cũng có.

Bạn có thể có

Animal obj = new Man(); 

Animal obj = getAnimalForThisCriteria(something here);//this will return some animal at runtime so you can catch instance using Animal. 

Bạn có thể có ba khác nhau Lớp Ma, Cún Yêu, Lion với cùng một phương pháp nhưng không có cách nào để nói với tất cả họ đều động vật, trừ khi họ mở rộng hoặc thực hiện lớp thông thường hoặc giao diện, đây có khái niệm về cấu trúc

+0

Tại sao chúng ta nên tạo lớp Thú thêm. Chúng ta có thể khai báo lời nói() trong mỗi lớp. Điều gì là phù hợp chúng ta sẽ nhận được từ lớp Animal và thực hiện nói() trong tất cả các lớp phụ. Tôi vẫn chưa hiểu khái niệm này. – Nishi

+0

Kiểm tra cập nhật ......... –

+0

@JigarJoshi giải thích tốt +1 – SpringLearner

4

Có giao diện riêng biệt với các lớp cho phép chia tách giữa, tốt, giao diện của đối tượng và triển khai đối tượng. Nếu không có chúng, bạn sẽ không có cách tiêu chuẩn để chỉ ra rằng một số lớp không nên chứa chi tiết thực hiện.

Thứ hai, vì Java không hỗ trợ đa thừa kế, giao diện là giải pháp một phần, bằng cách cho phép thừa kế trên các tính năng bên ngoài của lớp.

1

Giao diện là khi bạn chỉ quan tâm đến khả năng của đối tượng, không phải cách thức nó đạt được chúng.

Giả sử bạn đang viết mã kiểm soát mức cao cho rô bốt. Bạn không quan tâm đến cách robot thực sự hoạt động, bạn chỉ muốn có thể nói nó tiến lên, lùi, rẽ trái hoặc phải, vv Nếu không có giao diện, bạn sẽ triển khai một lớp trừu tượng có tên là AbstractRobot có tất cả các phương thức phương pháp trừu tượng. Tại thời điểm này, bạn về cơ bản đã tạo ra một giao diện, nhưng ở dạng một lớp trừu tượng, nhưng một cái là 'nặng hơn' so với yêu cầu.

Cuối cùng, một lớp có thể phù hợp với nhiều giao diện, nhưng chỉ có thể kế thừa từ một lớp. Điều này cho phép một số mẫu thiết kế dựa trên nhiều thừa kế.

0

Tôi sẽ cố gắng giải thích điều này bằng những từ đơn giản.

Cân nhắc trò chơi trên máy tính yêu thích của bạn, nói Counter Strike. Trong trò chơi này, người chơi (những kẻ khủng bố hoặc những kẻ khủng bố phản đối) sử dụng vũ khí.

Nếu chúng ta dạy cho người chơi cách sử dụng weapon (tương tự như Interface), nó có thể sử dụng bất kỳ loại vũ khí như AK47, Maverick, Shotgun, Sniper (tương tự đối với các class kế thừa giao diện vũ khí).

Lợi thế của việc này là xem xét Bazooka (triển khai Vũ khí) được phát triển trong các phiên bản sau. Sau đó, người chơi hiện tại sẽ có thể sử dụng nó mà không có bất kỳ sửa đổi nào - vì nó biết cách sử dụng giao diện Weapon :-)

Đây chỉ là một ví dụ đơn giản. Có nhiều lý do khác để sử dụng giao diện.

+1

Ví dụ này sẽ hoạt động ngay cả khi giao diện không tồn tại. Bạn sẽ chỉ định nghĩa một lớp vũ khí của mẹ. –

+0

Ồ đúng rồi. Nhưng tốt hơn là sử dụng Giao diện, vì các lớp sẽ có thể kế thừa các lớp khác. Nếu chúng ta sử dụng lớp vũ khí mẹ, các lớp dẫn xuất sẽ không thể kế thừa từ bất kỳ lớp nào khác do không tồn tại nhiều thừa kế trong Java. – Trivikram

0

Đơn giản. Tôi nghĩ rằng các lớp Giao diện và Tóm tắt đều có cùng mục đích. Sự khác biệt là nếu bạn mở rộng một lớp trừu tượng, bạn không thể mở rộng không có lớp nào khác trong Java. Lý do: Java không hỗ trợ Multiple Inheritance. Đồng thời, Bạn có thể thực hiện bất kỳ số Giao diện nào cho một lớp.

2

Bạn nên sử dụng lớp trừu tượng hoặc giao diện nào?

Xem xét sử dụng lớp trừu tượng nếu bất kỳ của các báo cáo này áp dụng đối với tình hình của bạn:

  • Bạn muốn chia sẻ mã trong một số lớp học liên quan chặt chẽ.
  • Bạn mong đợi rằng các lớp mở rộng lớp trừu tượng của bạn có nhiều phương thức hoặc trường phổ biến hoặc yêu cầu công cụ sửa đổi truy cập ngoài công khai (chẳng hạn như được bảo vệ và riêng tư).
  • Bạn muốn khai báo các trường không tĩnh hoặc không phải cuối cùng. Điều này cho phép bạn xác định các phương thức có thể truy cập và sửa đổi trạng thái của đối tượng mà chúng thuộc về.

Xem xét sử dụng giao diện nếu bất kỳ của các báo cáo này áp dụng đối với tình hình của bạn:

  • Bạn hy vọng rằng các lớp học không liên quan sẽ thực hiện giao diện của bạn. Ví dụ, các giao diện Comparable và Cloneable được thực hiện bởi nhiều lớp không liên quan.
  • Bạn muốn chỉ định hành vi của một loại dữ liệu cụ thể, nhưng không quan tâm đến việc ai thực hiện hành vi của nó.
  • Bạn muốn tận dụng lợi thế của nhiều loại thừa kế.
0

Việc sử dụng giao diện quan trọng nhất khi tôi thấy nó đang chuyển mã (anonymous inner class hoặc lambda) đến phương thức làm tham số.

Ví dụ:

Giả sử chúng ta muốn thực hiện một phương pháp mà có thể trở lại thời gian thực hiện cần thiết để chạy một đoạn mã. Chúng tôi muốn chuyển mã của chúng tôi dưới dạng tham số cho phương thức này.

interface Code{ 
    public void run(); 
} 


long getExectutionTime(Code code){ 

    long startTime = System.nanoTime();  
    code.run();  
    return System.nanoTime() - startTime; 
} 


getExecutionTime(new Code(){ 

    public void run(){ 
      //the code to be executed 
    } 
}); 

Trong java 8,

getExecutionTime(()->{ 
    //the code to be executed 
}); 
0

Interface là gì, nhưng nó là một dòng hướng dẫn thi hành mới nó cung cấp một số hướng dẫn để thực hiện mới và phân loại các chức năng của đối tượng .Tại chi tiết như thế nào nếu chúng ta tạo ra một giao diện sau đó chúng ta tạo ra một hướng dẫn để thực hiện.

0

Sự tương tự cho giao diện là suy nghĩ về một lớp bằng cách sử dụng một giao diện giống như ổ cắm điện trên tường, và nghĩ đến việc thực hiện như là phích cắm. Các cửa hàng không quan tâm những gì đằng sau cắm, miễn là nó phù hợp trong ổ cắm. Về psuedocode nó có thể được viết như thế này:

public interface ElectricOutlet { 
    public void powerUp(); 
} 

Và một lớp mà thực hiện ElectricOutlet có thể trông như thế này:

public class Appliance implements ElectricOutlet { 
    //member variables 
    public void powerUp() { 
     //Draw power from the wall 
    } 
    ... 
} 

Vì vậy, làm thế nào để bạn sử dụng giao diện đó? Như thế này:

//lots of other code 
ElectricOutlet out = new Appliance(); //plug the appliance into the outlet 
out.powerUp; //power it up! 

Tất nhiên, nó không phải là thiết bị mà bạn cắm vào ổ cắm. Nó có thể là một TV, hoặc một máy tính xách tay, hoặc một máy cắt cỏ, nhưng tất cả đều hành xử theo cùng một cách từ quan điểm của cửa hàng. Vậy điều này áp dụng cho lập trình như thế nào? Theo cách giống hệt:

List<String> list = new ArrayList<String>(); // create a new List of Strings 

Tôi vừa tạo một Danh sách chuỗi mới (trống). Nếu nó quay ra rằng ArrayList không cung cấp hiệu suất đúng, và LinkedList hoạt động tốt hơn, tôi có thể quay trở lại và thay đổi dòng này:

List<String> = new LinkedList<String>(); //should work better now 

tôi có thể làm điều này vì cả hai ArrayList và LinkedList thực hiện các giao diện Danh sách và do đó chúng cung cấp cùng một hành vi (API), mặc dù các triển khai nội bộ có thể khác nhau. Tuy nhiên, từ quan điểm của Danh sách, không quan trọng những hoạt động bên trong là gì, miễn là giao diện ở đó. Điều này cho phép rất nhiều sự độc lập giữa các lớp học, và cho phép tái sử dụng nhiều hơn.

Các vấn đề liên quan