Câu hỏi Sự khác nhau giữa giao diện và lớp trừu tượng là gì?


Sự khác biệt chính xác giữa giao diện và lớp trừu tượng là gì?


1473
2017-12-16 08:15


gốc


Đây là một câu hỏi phỏng vấn rất phổ biến. Thật đáng ngạc nhiên vì một lớp trừu tượng hiếm khi được sử dụng trong các giải pháp so với những thứ khác. Câu hỏi của bạn đã giúp tôi Safraz. - Catto
Câu hỏi này cũng có thể giúp hiểu khái niệm về giao diện stackoverflow.com/q/8531292/1055241 - gprathour
Tôi đã gỡ bỏ thẻ PHP tạo thành câu hỏi này, vì hầu như không có câu trả lời nào là ngôn ngữ cụ thể và bản thân câu hỏi đó không phải là ngôn ngữ cụ thể. - brice
Bạn có thể đọc blog. Bạn sẽ tìm thấy sự hiểu biết tốt hơn. alpeshsorathiya.blogspot.in/2017/11/… Cảm ơn. - Alpesh Sorathiya


Các câu trả lời:


Giao diện

Giao diện là một hợp đồng: Người viết giao diện nói, "này, tôi chấp nhận mọi thứ nhìn theo cách đó"và người đang sử dụng giao diện cho biết"OK, lớp tôi viết trông như vậy".

Giao diện là một vỏ rỗng. Chỉ có chữ ký của các phương pháp, ngụ ý rằng các phương pháp không có một cơ thể. Giao diện không thể làm gì cả. Nó chỉ là một khuôn mẫu.

Ví dụ (mã giả):

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }


    int getFuel()
    {
        return this.fuel;
    }
}

Thực hiện một giao diện tiêu thụ rất ít CPU, bởi vì nó không phải là một lớp, chỉ là một loạt các tên, và do đó không có bất kỳ đắt tiền nhìn lên để làm. Thật tuyệt vời khi nó quan trọng, chẳng hạn như trong các thiết bị nhúng.


Lớp trừu tượng

Các lớp trừu tượng, không giống như các giao diện, là các lớp. Chúng đắt tiền hơn để sử dụng, bởi vì có một cái nhìn để làm khi bạn kế thừa từ chúng.

Các lớp trừu tượng trông giống như giao diện, nhưng chúng có nhiều thứ hơn: Bạn có thể định nghĩa hành vi cho chúng. Đó là nhiều hơn về một người nói rằng, "những lớp học này sẽ trông như thế, và họ có điểm chung, vì vậy hãy điền vào chỗ trống!".

Ví dụ:

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

Thực hiện

Trong khi các lớp trừu tượng và các giao diện được cho là các khái niệm khác nhau, việc triển khai thực hiện câu lệnh đó đôi khi không đúng sự thật. Đôi khi, họ thậm chí không phải là những gì bạn nghĩ rằng họ đang có.

Trong Java, quy tắc này được thực thi mạnh mẽ, trong khi trong PHP, các giao diện là các lớp trừu tượng không có phương thức được khai báo.

Trong Python, các lớp trừu tượng là một thủ thuật lập trình bạn có thể nhận được từ mô đun ABC và thực sự sử dụng các metaclasses, và do đó các lớp. Và các giao diện có liên quan nhiều hơn đến việc gõ vịt bằng ngôn ngữ này và đó là sự kết hợp giữa các quy ước và các phương thức đặc biệt gọi các bộ mô tả (các phương thức __method__).

Như thường lệ với lập trình, có lý thuyết, thực hành và thực hành bằng ngôn ngữ khác :-)


1968
2017-12-16 08:37



Điểm mấu chốt về giao diện không phải là quá nhiều mà họ nói những gì một lớp học, nhưng cho phép các đối tượng có thể Wizzle để làm cho mình hữu ích cho mã mà cần một Wizzler. Lưu ý rằng trong nhiều trường hợp không phải người viết điều có thể Wizzle, cũng không phải người cần Wizzler, sẽ là người viết giao diện. - supercat
Tôi không nghĩ rằng tiêu thụ CPU là điểm nổi bật trên giao diện. - Dan Lugg
@ e-satis Với Java 8, bạn có thể định nghĩa các phương thức mặc định trong các giao diện tương đương với các phương thức không trừu tượng trong các lớp trừu tượng. Với sự bổ sung này, tôi không còn thấy sự khác biệt thực sự giữa các lớp trừu tượng và giao diện ngoài thực tế là tôi nên sử dụng các giao diện vì các lớp có thể thực hiện nhiều giao diện nhưng chỉ có thể kế thừa một lớp - Ogen
Tôi muốn cung cấp cho bạn nhiều hơn một upvote cho giải thích của bạn ... - Ashish Shukla
Tôi nghĩ sự so sánh giữa interface và class từ Head First Java sống động A class defines who you are, and an interface tells what roles you could play - AnnabellChan


Sự khác biệt về kỹ thuật chính giữa lớp trừu tượng và một giao diện là:

  • Các lớp trừu tượng có thể có hằng số, thành viên, phương thức khai báo (các phương thức không có phần thân) và các phương thức đã định nghĩa, trong khi giao diện chỉ có thể có hằng số và phương pháp khai.

  • Phương thức và thành viên của lớp trừu tượng có thể được xác định bằng mọi khả năng hiển thị, trong khi tất cả các phương thức của giao diện phải được định nghĩa là public (chúng được định nghĩa là công khai theo mặc định).

  • Khi kế thừa một lớp trừu tượng, một bê tông lớp trẻ em phải định nghĩa các phương thức trừu tượng, trong khi một lớp trừu tượng có thể mở rộng một lớp trừu tượng và các phương thức trừu tượng khác từ lớp cha không cần phải được định nghĩa.

  • Tương tự, giao diện mở rộng giao diện khác là không chịu trách nhiệm thực hiện các phương pháptừ giao diện cha. Điều này là do các giao diện không thể xác định bất kỳ việc thực hiện nào.

  • Một lớp trẻ em chỉ có thể mở rộng một lớp duy nhất (trừu tượng hoặc cụ thể), trong khi một giao diện có thể mở rộng hoặc một lớp có thể triển khai nhiều giao diện khác.

  • Một lớp con có thể định nghĩa các phương thức trừu tượng với tầm nhìn tương tự hoặc ít hạn chế hơn, trong khi một lớp thực hiện một giao diện phải xác định các phương thức có cùng khả năng hiển thị (công khai).


754
2017-12-16 10:11



tôi nghĩ đây là câu trả lời hay nhất vì nó làm nổi bật tất cả những khác biệt chính. một ví dụ không thực sự cần thiết. - Joshua K
Và thông thường với các lớp, bạn có thể khởi tạo một đối tượng từ nó không giống như các lớp trừu tượng CANNOT được khởi tạo. - SASM
Tôi nghĩ rằng một lớp học thực hiện giao diện cần phải xác định tất cả các phương pháp trong giao diện? - Jiazzy user
@Jiazzyuser Nếu một lớp trừu tượng thực hiện một giao diện, nó không phải thực sự xác định các phương thức của giao diện. Yêu cầu đó có thể được hoãn lại cho các lớp bê tông thừa kế / con. Tuy nhiên, một lớp cụ thể phải thực hiện tất cả các phương thức giao diện không được lớp cha của nó triển khai thực hiện. Tôi sẽ thêm ví dụ để minh họa điểm này. - Justin Johnson
"Khi kế thừa một lớp trừu tượng, lớp con phải định nghĩa các phương thức trừu tượng, trong khi một giao diện có thể mở rộng một giao diện và các phương thức khác không cần phải được định nghĩa." - Đây không phải là sự thật. Cũng giống như một giao diện có thể mở rộng một giao diện mà không định nghĩa các phương thức, một lớp trừu tượng có thể kế thừa một lớp trừu tượng mà không cần định nghĩa các phương thức. - Nick


Giao diện chỉ chứa định nghĩa / chữ ký của chức năng, và nếu chúng ta có một số chức năng chung cũng như chữ ký chung, thì chúng ta cần sử dụng một lớp trừu tượng. Bằng cách sử dụng một lớp trừu tượng, chúng ta có thể cung cấp hành vi cũng như chức năng cả hai cùng một lúc. Một nhà phát triển khác kế thừa lớp trừu tượng có thể sử dụng chức năng này một cách dễ dàng, vì họ chỉ cần điền vào chỗ trống.

enter image description here

Được lấy từ:

http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html

http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html


110
2017-09-15 08:59



Bạn cần phải nói những gì ngôn ngữ này áp dụng cho ("Tóm tắt lớp không hỗ trợ đa thừa kế" là xa là phổ quát đúng) - Ben Voigt
So sánh cuối cùng là khó hiểu theo bảng! Các phương thức trong giao diện không thể tĩnh nhưng các biến là các phương thức tĩnh cuối cùng Các phương thức thực hiện trong lớp trừu tượng có thể là tĩnh - realPK
Typo nó không Cunstructor .. Constructor của nó .. - Pra Jazz
Thành viên của giao diện phải là cuối cùng tĩnh. Tuyên bố cuối cùng là sai. - Nepster
Ngôn ngữ lập trình được nhắm mục tiêu ở đây là gì? C #? - Peter Mortensen


Có thể tìm thấy giải thích tại đây: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Một lớp trừu tượng là một lớp   chỉ được thực hiện một phần bởi   lập trình viên. Nó có thể chứa một hoặc nhiều   phương pháp trừu tượng. Một phương pháp trừu tượng   chỉ đơn giản là định nghĩa hàm   phục vụ cho người lập trình biết rằng   phương pháp phải được thực hiện trong một đứa trẻ   lớp học.

Giao diện tương tự như tóm tắt   lớp học; thực sự giao diện chiếm   cùng một không gian tên như các lớp và trừu tượng   các lớp học. Vì lý do đó, bạn không thể   xác định một giao diện có cùng tên   như một lớp học. Giao diện hoàn toàn   lớp trừu tượng; không có phương pháp nào của nó   được triển khai và thay vì một lớp học   sub-classing từ nó, nó được cho là   triển khai giao diện đó.

Dù sao tôi tìm thấy lời giải thích này của giao diện hơi khó hiểu. Một định nghĩa phổ biến hơn là: Một giao diện định nghĩa một hợp đồng thực hiện các lớp phải đáp ứng. Một định nghĩa giao diện bao gồm chữ ký của các thành viên công cộng, không có bất kỳ mã thực thi nào.


77
2017-12-16 08:18



Đây là câu trả lời đúng nhất, vì các giao diện PHP khác với các ngôn ngữ khác trong giao diện PHP LÀ các lớp trừu tượng bên dưới nắp, trong khi các giao diện ngôn ngữ khác là chữ ký mà các lớp phải khớp. Họ hành xử giống như miễn là không có lỗi mặc dù. - Tor Valamo
Đúng vậy, đối với PHP, đó là anwser tốt nhất thực sự. Nhưng nó khó khăn hơn để nhận được từ các văn bản blob hơn từ một đoạn mã đơn giản. - e-satis
Từ các định nghĩa bạn cung cấp, chúng trông giống nhau ngoại trừ một chi tiết: và giao diện là trừu tượng 100%, trong khi lớp trừu tượng là trừu tượng một phần và có thể có một số phương thức triển khai (có lẽ tất cả các phương thức đều có thể triển khai?). - jww


Một số khác biệt quan trọng:

Trong các hình thức của một bảng:

Difference

Như Joe nói từ javapapers:

1.Một sự khác biệt chính là các phương thức của giao diện Java hoàn toàn trừu tượng và không thể triển khai. Một lớp trừu tượng Java có thể   có các phương thức thể hiện thực hiện hành vi mặc định.

2. Các biến được khai báo trong một giao diện Java là theo mặc định cuối cùng. Một lớp trừu tượng có thể chứa các biến không phải là cuối cùng.

3.Mặc định của một giao diện Java được công khai theo mặc định. Một lớp trừu tượng Java có thể có các hương vị thông thường của các thành viên lớp như riêng tư,   được bảo vệ, v.v.

4.Java giao diện nên được thực hiện bằng cách sử dụng từ khóa "thực hiện"; Một lớp trừu tượng Java nên được mở rộng bằng cách sử dụng từ khóa “mở rộng”.

Giao diện 5.An chỉ có thể mở rộng một giao diện Java khác, một lớp trừu tượng có thể mở rộng một lớp Java khác và triển khai thực hiện nhiều Java   giao diện.

6. Một lớp Java có thể thực hiện nhiều giao diện nhưng nó chỉ có thể mở rộng một lớp trừu tượng.

7.Interface là hoàn toàn trừu tượng và không thể được instantiated; Một lớp trừu tượng Java cũng không thể được khởi tạo, nhưng có thể được gọi nếu một   main () tồn tại.

8.Trong so sánh với các lớp trừu tượng java, các giao diện java chậm vì nó đòi hỏi thêm sự vô hướng.


37
2018-05-16 05:55



Tôi đã chỉnh sửa câu trả lời của bạn để cung cấp phân bổ chính xác. Bạn không thể chỉ cần thả một liên kết ở dưới cùng của câu trả lời của bạn. Bạn cũng cần trích dẫn tất cả ngôn ngữ đã được sao chép từ một nguồn khác. Ngoài ra, nếu bảng đó được rút ra từ đâu đó, bạn nên chỉ rõ nó ở đâu. - Brad Larson♦
Xin đề cập đến cho C + + là tốt .. mặc dù không có từ khóa "giao diện" trong C ++ như vậy, nhưng nó thường được hỏi Qn regd C ++ là tốt. - cbinder
@cbinder: Không có từ khoá 'giao diện' trong c ++. Để biết sự khác biệt trong c ++, vui lòng tham khảo 1. tutorialspoint.com/cplusplus/cpp_interfaces.htm 2. tutorialspoint.com/cplusplus/cpp_interfaces.htm - softmage99
@MageshBabu Có lẽ việc định nghĩa một hàm trong một lớp có chứa hàm ảo thuần túy làm cho nó trở thành một lớp trừu tượng hơn là giao diện - cbinder
Với Java 8, sự khác biệt là ít hơn bây giờ. Kiểm tra sự khác biệt được cập nhật tại đây: journaldev.com/1607/… - Pankaj


Tôi không muốn làm nổi bật sự khác biệt, đã được nói trong nhiều câu trả lời (liên quan đến công cụ sửa đổi tĩnh cuối cùng cho các biến trong giao diện và hỗ trợ cho các phương thức riêng tư được bảo vệ trong các lớp trừu tượng)

Nói một cách đơn giản, tôi muốn nói:

giao diện: Để thực hiện một hợp đồng bởi nhiều đối tượng không liên quan

lớp trừu tượng: Để thực hiện hành vi giống nhau hoặc khác nhau giữa nhiều đối tượng liên quan

Từ Oracle tài liệu

Cân nhắc sử dụng các lớp trừu tượng nếu :

  1. Bạn muốn chia sẻ mã giữa một số lớp liên quan chặt chẽ.
  2. 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ác công cụ sửa đổi truy cập ngoài công khai (như bảo vệ và riêng tư).
  3. 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.

Xem xét sử dụng giao diện nếu :

  1. Bạn hy vọng rằng các lớp không liên quan sẽ triển khai giao diện của bạn. Ví dụ: nhiều đối tượng không liên quan có thể triển khai Serializable giao diện.
  2. Bạn muốn xác định hành vi của một kiểu dữ liệu cụ thể, nhưng không quan tâm đến ai thực hiện hành vi của nó.
  3. Bạn muốn tận dụng lợi thế của nhiều loại thừa kế.

lớp trừu tượng thiết lập "là một" mối quan hệ với các lớp cụ thể. giao diện cung cấp khả năng "có" cho các lớp.

Nếu bạn đang tìm kiếm Java dưới dạng ngôn ngữ lập trình, dưới đây là một vài cập nhật khác:

Java 8 đã giảm khoảng cách giữa interface và abstract các lớp học ở một mức độ nào đó bằng cách cung cấp default tính năng phương thức. Giao diện không có triển khai cho phương thức hiện không còn hợp lệ nữa.

Tham khảo tài liệu này trang để biết thêm chi tiết.

Hãy xem câu hỏi SE này để biết các ví dụ mã để hiểu rõ hơn.

Làm thế nào tôi đã giải thích sự khác biệt giữa một giao diện và một lớp trừu tượng?


35
2017-11-27 12:42





Điểm chính là:

  • Tóm tắt là hướng đối tượng. Nó cung cấp các dữ liệu cơ bản một 'đối tượng' nên có và / hoặc chức năng nó sẽ có thể làm. Nó có liên quan với các đặc điểm cơ bản của đối tượng: những gì nó có và những gì nó có thể làm. Do đó các đối tượng kế thừa từ cùng một lớp trừu tượng chia sẻ các đặc điểm cơ bản (khái quát).
  • Giao diện là chức năng định hướng. Nó định nghĩa các chức năng mà một đối tượng cần có. Bất kể đối tượng là gì, miễn là nó có thể thực hiện các chức năng này, được định nghĩa trong giao diện, nó ổn. Nó bỏ qua mọi thứ khác. Một đối tượng / lớp có thể chứa một số (nhóm) chức năng; do đó nó có thể cho một lớp để thực hiện nhiều giao diện.

23
2017-09-29 09:54



Cảm ơn bạn bây giờ chúng tôi đang nhận được một nơi nào đó với một phản ứng cấp cao tốt. Vui bao xa sâu vào các ý kiến ​​bạn phải đi để tìm một phản ứng dựa trên sự hiểu biết hơn. - Andrew
Các câu trả lời khác quá kỹ thuật. Điều này đang hướng tới những gì tôi cảm thấy là một câu trả lời 'đúng'. Toàn bộ điểm của OOP là ngữ nghĩa, và có hay không một lớp lồng nhau riêng được công khai getters được gọi thông qua CPU tra cứu đắt tiền là khá nhiều không liên quan ở đây - Sentinel


Khi bạn muốn cung cấp hành vi đa hình trong một hệ thống phân cấp thừa kế, hãy sử dụng các lớp trừu tượng.

Khi bạn muốn hành vi đa hình cho các lớp hoàn toàn không liên quan, hãy sử dụng một giao diện.


21
2018-05-28 04:42



bây giờ để google đa hình - Andrew


Tôi đang xây dựng một tòa nhà 300 tầng

Bản thiết kế của tòa nhà giao diện

  • Ví dụ, Servlet (I)

Tòa nhà được xây dựng lên đến 200 tầng - đã hoàn thành một phần ---trừu tượng

  • Thực hiện một phần, ví dụ, servlet chung và HTTP

Công trình xây dựng đã hoàn thành-bê tông

  • Thực hiện đầy đủ, ví dụ, servlet riêng

Giao diện

  • Chúng tôi không biết gì về việc triển khai, chỉ yêu cầu. Chúng ta có thể đi cho một giao diện.
  • Mỗi phương thức đều công khai và trừu tượng theo mặc định
  • Nó là một lớp trừu tượng tinh khiết 100%
  • Nếu chúng tôi tuyên bố công khai, chúng tôi không thể tuyên bố riêng tư và được bảo vệ
  • Nếu chúng ta khai báo abstract, chúng ta không thể khai báo final, static, synchronized, strictfp và native
  • Mọi giao diện đều có công khai, tĩnh và cuối cùng
  • Việc tuần tự hóa và tạm thời không áp dụng được, bởi vì chúng ta không thể tạo một cá thể trong giao diện
  • Không dễ bay hơi vì nó là cuối cùng
  • Mọi biến là tĩnh
  • Khi chúng ta khai báo một biến bên trong một giao diện, chúng ta cần khởi tạo các biến trong khi khai báo
  • Trường hợp và khối tĩnh không được phép

trừu tượng

  • Triển khai từng phần
  • Nó có một phương pháp trừu tượng. Ngoài ra, nó sử dụng bê tông
  • Không hạn chế đối với các công cụ sửa đổi phương thức lớp trừu tượng
  • Không hạn chế đối với các biến tố biến lớp trừu tượng
  • Chúng tôi không thể khai báo các công cụ sửa đổi khác ngoại trừ trừu tượng
  • Không có hạn chế để khởi tạo biến

Lấy từ trang web DurgaJobs


21
2017-07-09 18:00



Một lớp trừu tượng có thể có một hàm tạo - vimal krishna
Tôi hoàn toàn không đồng ý với quan điểm này. Bản thiết kế là một khái niệm hoàn toàn khác với 'giao diện'. Kế hoạch chi tiết tương tự với mô hình tĩnh hoặc đặc tả thiết kế để thực hiện cụ thể. Nó gần gũi hơn với 'class', vì kế hoạch chi tiết có thể được khởi tạo nhiều lần thông qua hàm tạo của nó, nhưng ngay cả điều này cũng không đủ gần vì 'lớp' cũng chứa đặc tả về cách xây dựng (ctor) và phương tiện vì thế. Giao diện như là một khái niệm được thiết kế để đại diện cho một số hành vi, chẳng hạn như Heat Up / Cool Down, có thể được áp dụng cho nhiều thứ, ví dụ: tòa nhà, lò nướng, v.v. - Sentinel


Chúng ta hãy làm việc trên câu hỏi này một lần nữa:

Điều đầu tiên cho bạn biết là kết quả 1/1 và 1 * 1 giống nhau, nhưng điều đó không có nghĩa là phép nhân và phép chia đều giống nhau. Rõ ràng, họ giữ một số mối quan hệ tốt, nhưng tâm trí bạn cả hai đều khác nhau.

Tôi sẽ chỉ ra những khác biệt chính, và phần còn lại đã được giải thích:

Các lớp trừu tượng rất hữu ích để mô hình hóa một hệ thống phân cấp lớp. Thoạt nhìn bất kỳ yêu cầu nào, chúng tôi đã rõ ràng một phần về những gì chính xác sẽ được xây dựng, nhưng chúng ta biết những gì để xây dựng. Và các lớp trừu tượng của bạn là các lớp cơ sở của bạn.

Giao diện rất hữu ích để cho phép hệ thống phân cấp hoặc các lớp khác biết rằng những gì tôi có khả năng làm. Và khi bạn nói tôi có khả năng gì đó, bạn phải có khả năng đó. Các giao diện sẽ đánh dấu nó là bắt buộc đối với một lớp để thực hiện các chức năng giống nhau.


18
2018-04-11 05:18



Câu trả lời hay, nhưng phép ẩn dụ toán học là vô ích và khiến tôi lãng phí gần một lượng thời gian tương đương để đọc nó khi viết nhận xét này. Bây giờ nhân với tất cả những người khác đã đọc câu hỏi này. - Andrew
"phép ẩn dụ toán học là vô ích", tại sao bạn nghĩ vậy? - Dhananjay