Giao diện là lớp trừu tượng 100%, vì vậy chúng tôi có thể sử dụng giao diện để lập trình hiệu quả. Có tình huống nào mà lớp trừu tượng tốt hơn giao diện không?Cần cho lớp trừu tượng cũng như giao diện?
Trả lời
Các lớp trừu tượng được sử dụng khi bạn không có ý định tạo ra một lớp bê tông, nhưng muốn chắc chắn rằng có một số chung nhà nước trong tất cả các lớp con hoặc có thể thực hiện chung đối với một số hoạt động.
Giao diện không được chứa.
Giao diện v/s lớp trừu tượng là một chủ đề tạo ra rất nhiều sự tò mò/quan tâm/nhầm lẫn đối với bất kỳ ai mới sử dụng Java và muốn đào sâu hơn.
This article cung cấp giải thích chi tiết về chủ đề.
Liên kết bạn cung cấp rất hữu ích. Nó đã sử dụng rõ ràng cả giao diện trừu tượng lẫn giao diện. – Warrior
Có, có nơi dành cho cả lớp và giao diện trừu tượng.
Hãy cùng với một ví dụ cụ thể. Chúng tôi sẽ xem xét cách tạo một CheckingAccount
và SavingsAccount
từ tóm tắt AbstractBankAccount
và xem cách chúng tôi có thể sử dụng giao diện phân biệt hai loại tài khoản.
Để bắt đầu, đây là một lớp trừu tượng AbstractBankAccount
:
abstract class AbstractBankAccount
{
int balance;
public abstract void deposit(int amount);
public abstract void withdraw(int amount);
}
Chúng tôi có số dư tài khoản như balance
và hai phương pháp deposit
và withdraw
đó phải được thực hiện bởi lớp con.
Như chúng ta có thể thấy, lớp trừu tượng tuyên bố cấu trúc về cách xác định tài khoản ngân hàng. Như @Uri đề cập đến trong phản hồi của mình, có một trạng thái cho lớp trừu tượng này, là trường balance
. Điều này sẽ không thể với một giao diện.
Bây giờ, chúng ta hãy lớp con AbstractBankAccount
để thực hiện một CheckingAccount
class CheckingAccount extends AbstractBankAccount
{
public void deposit(int amount)
{
balance += amount;
}
public void withdraw(int amount)
{
balance -= amount;
}
}
Trong lớp con này CheckingAccount
, chúng tôi thực hiện hai lớp trừu tượng - không có gì quá thú vị ở đây.
Bây giờ, làm cách nào chúng tôi có thể triển khai SavingsAccount
? Nó khác với CheckingAccount
ở chỗ nó sẽ thu được sự quan tâm. Tiền lãi có thể được tăng lên bằng cách sử dụng phương thức deposit
, nhưng sau đó một lần nữa, nó không giống như là khách hàng đang gửi tiền lãi cho họ. Do đó, có thể rõ ràng hơn nếu chúng tôi có một phương tiện khác để thêm tiền vào tài khoản, cụ thể là lãi suất, ví dụ: phương thức accrueInterest
.
Chúng ta có thể trực tiếp thực hiện phương pháp này trong SavingsAccount
, nhưng chúng ta có thể có nhiều loại tài khoản ngân hàng có thể cộng dồn lãi suất trong tương lai, vì vậy chúng tôi có thể muốn thực hiện một giao diện InterestBearing
rằng có accrueInterest
phương pháp:
interface InterestBearing
{
public void accrueInterest(int amount);
}
Vì vậy, bây giờ chúng ta có thể làm cho một lớp SavingsAccount
rằng có thể đạt được lợi ích bằng cách thực hiện các giao diện InterestBearing
:
class SavingsAccount extends AbstractBankAccount implements InterestBearing
{
public void deposit(int amount)
{
balance += amount;
}
public void withdraw(int amount)
{
balance -= amount;
}
public void accrueInterest(int amount)
{
balance += amount;
}
}
Bây giờ, nếu chúng ta muốn thực hiện anothe loại tài khoản, giả sử là PremiumSavingsAccount
, chúng tôi có thể tạo một lớp con của AbstractBankAccount
và triển khai giao diện InterestBearing
để tạo một tài khoản mang lãi khác.
Giao diện InterestBearing
có thể được xem là thêm tính năng phổ biến vào các lớp khác nhau. Nó sẽ không có ý nghĩa để có một tính năng để đối phó với lãi suất trong một tài khoản kiểm tra khi nó không tích lũy bất kỳ quan tâm.
Vì vậy, có những nơi thực sự cho cả lớp trừu tượng và giao diện cùng tồn tại và làm việc cùng nhau trong một tình huống.
Một hơn:
Có một bài báo trên thế giới Java mà mô tả sử dụng giao diện và trừu tượng lớp với nhau:
Nhìn chung, giao diện mô tả các API công cộng mà code của bạn nên sử dụng, trong khi các lớp cơ sở trừu tượng được lưu giữ tốt nhất như là một chi tiết thực hiện, nơi mà mã hoặc trạng thái chung có thể được giữ lại, để giảm trùng lặp trong bất kỳ lớp thực hiện nào.
Bằng cách sử dụng giao diện trong API, mọi người (bao gồm cả bạn) viết mã thử nghiệm dễ dàng hơn đối với lớp học của bạn, vì bạn có thể sử dụng các lớp thử nghiệm, chẳng hạn, không phụ thuộc vào bất kỳ tài nguyên bên ngoài nào thể hiện các loại hành vi xấu nhưng khó mô phỏng trong cuộc sống thực.
Vì vậy, java cung cấp giao diện List, và các lớp cơ sở trừu tượng AbstractList để "giảm thiểu những nỗ lực cần thiết để thực hiện" giao diện ...
Có một vài lý do khiến bạn có thể thích một lớp trừu tượng thực hiện miễn phí qua giao diện:
- Một số phôi và thao tác mẫu không thể nhất định có thể bị bắt tại thời gian biên dịch.
- Bạn có tùy chọn thêm các phương thức cụ thể trong phiên bản sau.
- Đã từng là một lợi ích hiệu suất đáng kể từ nhiều năm trước.
- Từ góc độ bảo mật tối nghĩa, bạn không thể có được một lớp đã tồn tại trước đó để triển khai các phương thức bằng cách tạo một lớp con của lớp đã tồn tại từ trước và lớp trừu tượng.
Nhưng mặt khác, từ khóa Java giao diện cho phép nguồn sạch hơn.
Cảm ơn bạn.Bạn đã cho tôi những ý tưởng có giá trị trong truy vấn của tôi. – Warrior
- 1. Tạo giao diện cho mẫu lớp trừu tượng trong C++
- 2. Mở rộng giao diện cho lớp trừu tượng
- 3. lớp trừu tượng thuần túy và giao diện
- 4. C# Lớp trừu tượng triển khai Giao diện
- 5. lớp trừu tượng không thực hiện giao diện
- 6. Giao diện Qt hoặc lớp trừu tượng và qobject_cast()
- 7. Tại sao chúng ta cần giao diện khi lớp trừu tượng tồn tại?
- 8. Phương pháp tĩnh trong giao diện/lớp trừu tượng
- 9. Giao diện/Mã hóa lớp trừu tượng Tiêu chuẩn
- 10. C# Trang trí - Giao diện hoặc Lớp trừu tượng?
- 11. Java lớp trừu tượng thực hiện giao diện
- 12. Builder design pattern - Không có lớp trừu tượng/giao diện
- 13. Các loại chung so với lớp trừu tượng/Giao diện
- 14. Khai báo tín hiệu trừu tượng trong lớp giao diện
- 15. Java- Sử dụng hằng số trong lớp trừu tượng cần được sử dụng bởi các lớp con cũng như
- 16. tham chiếu trừu tượng cho giao diện chung
- 17. Loại trừu tượng Scala đại diện cho loại phân lớp
- 18. Giao diện không phải ảo? (Cần một sự trừu tượng mức thấp rất hiệu quả)
- 19. Triển khai động cho lớp giao diện/trừu tượng trong Java
- 20. Đại biểu (biểu thức Lambda) Vs Giao diện và lớp trừu tượng
- 21. Niêm phong lớp trừu tượng hoặc giao diện trong lớp .NET
- 22. Giao diện có mức trừu tượng cao nhất không?
- 23. Khi nào sử dụng giao diện hoặc lớp trừu tượng? Khi nào sử dụng cả hai?
- 24. Mẫu quan sát trừu tượng so với giao diện
- 25. Giao diện và lớp trừu tượng chỉ với các phương thức trừu tượng ảo có giống nhau không?
- 26. Làm cách nào để bọc giao diện C++ (lớp trừu tượng) trong C++/CLI?
- 27. trừu tượng thực hiện giao diện rõ ràng trong C#
- 28. trường tĩnh công khai trong lớp trừu tượng hoặc giao diện
- 29. Tại sao tuyên bố giao diện là trừu tượng?
- 30. Đang cố gắng bắt chước một giao diện/lớp trừu tượng trong thực hành javascript xấu
Tôi sẽ tiếp tục xác định giao diện, ngay cả khi xác định lớp trừu tượng. Nó làm cho mã của bạn thêm thử nghiệm thân thiện và ít kết hợp với một triển khai cụ thể. – tvanfosson
Có, tất nhiên, tôi đồng ý 100%. Trong mã của tôi, tôi thường đưa ra giao diện cho giao diện (có vẻ ngớ ngẩn) và sử dụng lớp trừu tượng làm cơ sở cho việc triển khai và trạng thái chuẩn. – Uri
Bạn đã nói: "và sử dụng lớp trừu tượng làm cơ sở để triển khai chuẩn và tiểu bang Bạn có thể là: " và sử dụng lớp trừu tượng làm cơ sở cho "triển khai chung" và trạng thái " – Shaw