Tôi có thể coi các phương thức giao diện là phương thức trừu tượng không?


15

Tôi đã suy nghĩ về điều đó, và tôi đã có một số nghi ngờ.

Khi tôi khai báo một giao diện, ví dụ:

public interface MyInterface
{
   public void method1();
   public void method2();
}

Những phương pháp giao diện này có thể được coi là trừu tượng? Ý tôi là khái niệm về một phương thức trừu tượng là:

Một phương thức trừu tượng là một phương thức được khai báo, nhưng không chứa triển khai.

Vì vậy, những phương pháp này có thể được coi là trừu tượng? Chúng không phải là phương pháp trừu tượng "thuần túy" vì tôi không sử dụng abstracttừ này, nhưng về mặt khái niệm, có vẻ như chúng là như vậy.

Những gì bạn có thể cho tôi biết về nó?

Cảm ơn.


Có lẽ là tốt nhất trên SO
billy.bob

5
@ billy.bob - Tôi nghĩ nó quá trừu tượng cho Stack Overflow. Không có vấn đề mã hóa cụ thể ở đây.
ChrisF

Đây có phải là mã Java không?
Andres F.

không, không phải vậy. nó chỉ là một ví dụ câu hỏi không tập trung vào bất kỳ ngôn ngữ lập trình nào.
rogcg

Câu trả lời:


14

Một giao diện giống như một lớp trừu tượng "hoàn toàn". Các lớp và tất cả các phương thức của nó là trừu tượng. Một lớp trừu tượng có thể đã thực hiện các phương thức nhưng bản thân lớp đó không thể được khởi tạo (hữu ích cho việc kế thừa và tuân theo DRY).

Đối với một giao diện, vì không có bất kỳ triển khai nào cả, chúng hữu ích cho mục đích của họ: hợp đồng. Nếu bạn thực hiện Giao diện thì bạn phải  thực hiện các phương thức trong giao diện.

Vì vậy, sự khác biệt là một lớp trừu tượng có thể đã thực hiện các phương thức trong khi một giao diện không thể.

Lý do chúng tách biệt là vì vậy một lớp có thể thực hiện một số giao diện. Java và C # hạn chế một lớp vốn có từ một lớp cha duy nhất. Một số ngôn ngữ cho phép bạn kế thừa từ nhiều lớp và bạn có thể hoàn thành công việc của giao diện thông qua lớp trừu tượng "hoàn toàn". Nhưng đa thừa kế có vấn đề của nó, cụ thể là vấn đề Kim cương đáng sợ


+1 để kết hợp sự khác biệt giữa kế thừa của một lớp trừu tượng và việc thực hiện một hoặc nhiều giao diện.

Vấn đề kim cương là một nghịch lý tuyệt vời.
rogcg

1
Tôi không đồng ý với 'Giao diện giống như một phần "hoàn toàn" lớp trừu tượng ". Chúng là 2 loại khác nhau của 'khối xây dựng', vì vậy chúng thực sự không giống nhau chút nào. Họ chia sẻ một số tính năng phổ biến, nhưng về bản chất, họ là những loại khác nhau, ví dụ như đàn ông và phụ nữ hơn :)
NoChance

5
@Emmand Kareem Tôi không đồng ý với 'Giao diện giống như một phần trừu tượng "hoàn toàn". Đó là lý do tại sao tôi viết nó :-). Nếu bạn có bất kỳ lý do chính đáng nào cho sự bất đồng của mình, vui lòng đăng, id muốn nghe
coder

Điều đáng chú ý là c # 8 cũng giới thiệu khái niệm triển khai giao diện mặc định
John Wu

11

Tôi đã tìm thấy một câu trả lời hữu ích ở đây: http://doad.oracle.com/javase/tutorial/java/IandI/abauge.html

Tất cả các phương thức trong một giao diện đều hoàn toàn trừu tượng, do đó, công cụ sửa đổi trừu tượng không được sử dụng với các phương thức giao diện (nó có thể là không cần thiết).


1
Cũng lưu ý rằng một lớp trừu tượng mở rộng một đối tượng khác. Các giao diện không có khái niệm về một siêu lớp.

2
Cũng lưu ý rằng bạn có thể thực hiện nhiều giao diện, nhưng bạn chỉ có thể kế thừa từ một lớp, trừu tượng hoặc không.
NullUserException

@ ThorbjørnRavnAndersen: Một giao diện có thể mở rộng một hoặc nhiều giao diện. Nó không giống như một siêu hạng, nhưng nó là một mức độ kế thừa.
unolysampler

Bạn có thể thực hiện nhiều giao diện. Trông giống như khái niệm về thừa kế nhiều, nhưng không chính xác.
rogcg

@unholysampler, không phải là siêu lớp - như tôi đã nói.

4

Các lớp trừu tượng có thể có các phương thức trừu tượng.

Các giao diện chỉ có thể có các phương thức trừu tượng.

method1()method2()trong ví dụ của bạn là các phương thức trừu tượng.


-1

Sự khác biệt ở đây là các lớp trừu tượng có thể chứa các chi tiết triển khai, mặc dù không thể tự khởi tạo. Trong khi đó một giao diện chỉ là một mẫu cho một lớp


8
Các phương pháp trừu tượng không thể chứa chi tiết thực hiện. Các lớp trừu tượng có thể.
Matt H

Tôi biết sự khác biệt giữa một phương thức và một lớp - nhưng tôi không thể hiểu được điểm bạn đang thực hiện?
billy.bob

Câu trả lời của bạn nói rằng các phương thức trừu tượng có thể chứa các chi tiết triển khai - chúng không thể. Chỉ là một lỗi đánh máy?
Matt H

1
Tôi đã sửa lỗi đánh máy.
Martijn Verburg

1
@ billy.bob câu hỏi này là về phương pháp abstact mặc dù.
SoylentGray

-2

Vì vậy, trong một lớp con, phương thức trừu tượng được kế thừa lại có thể trở nên trừu tượng mà không cần thực hiện, trong khi nếu một lớp thực hiện một giao diện thì phương thức đó phải được thực hiện.


-3

Các lớp giao diện không có các phương thức trừu tượng. Họ không có bất kỳ phương pháp nào cả. Họ chỉ có một danh sách các phương thức mà một lớp khác sẽ phải thực hiện để có thể phù hợp với giao diện. Trong ví dụ của bạn, không có phương thức method1 và không có phương thức method2 cho đến khi ai đó thêm các phương thức này vào một lớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.