Giả sử, chúng tôi có một lớp trừu tượng A
và chúng tôi muốn buộc tất cả các lớp con phải có một trường nhất định. Điều này là không thể trong Java, bởi vì chúng ta không thể định nghĩa các trường trừu tượng.Làm thế nào để có được xung quanh việc thiếu các lĩnh vực trừu tượng trong Java?
Cách giải quyết 1: Buộc các lớp con triển khai phương thức phân phối giá trị mong muốn.
abstract class A {
abstract int getA();
}
Nhược điểm: Mỗi lớp con có để thực hiện một phương pháp cho từng lĩnh vực trừu tượng chúng ta muốn có. Điều này có thể dẫn đến nhiều triển khai phương pháp.
Advantage: Chúng tôi có thể sử dụng phương pháp getA
trong lớp trừu tượng và triển khai phương pháp với nó trong A
mà không thực hiện chúng trong mỗi phân lớp. Nhưng giá trị đằng sau phương thức này không thể được ghi đè bởi lớp trừu tượng.
Cách giải quyết 2: Mô phỏng trường trừu tượng bằng cách buộc lớp con cung cấp cho lớp trừu tượng một giá trị.
abstract class A {
int a;
public A(int a) {
this.a = a;
}
}
Nhược điểm: Khi chúng ta có nhiều lĩnh vực (> 10), cuộc gọi constructor siêu sẽ xem xét một chút xấu xí và khó hiểu.
Advantage: Chúng tôi có thể sử dụng trường a
trong lớp trừu tượng và triển khai phương pháp với nó trong A
mà không thực hiện chúng trong mỗi phân lớp. Ngoài ra, giá trị a
có thể bị ghi đè bởi lớp trừu tượng.
Câu hỏi: Cách giải quyết nào là cách phổ biến để đạt được mục tiêu? Có lẽ có cái nào tốt hơn cái trên?
Tôi có thiếu gì đó không? Tại sao không chỉ đơn giản là cung cấp cho lớp trừu tượng một trường * bê tông * được bảo vệ? Tại sao mong muốn cho một trường "* trừu tượng *"? Trường trừu tượng để bắt đầu là gì? Một lần nữa, những gì tôi đang thiếu hoặc không hiểu? Tôi có đơn giản hóa quá mức vấn đề của bạn không? Và những vấn đề hành vi (không phải vấn đề mã) là bạn đang cố gắng để giải quyết anyway? –
Hoặc bạn có thể cung cấp cài đặt mặc định của 'getA()' và chỉ ghi đè lên nơi bạn muốn có giá trị khác. – Keppil
_Tại sao bạn muốn buộc tất cả các lớp con có trường? Vấn đề thường được xây dựng tốt hơn trong việc buộc họ phải có một _behavior_ cụ thể, mà bạn chỉ làm với các đặc tả phương thức. –