Về cơ bản, điều tôi muốn làm là buộc phân lớp để gọi phương thức siêu lớp trừu tượng (được thực hiện trong phân lớp), vì vậy tôi không phải viết nó một cách rõ ràng thời gian tôi tạo một phân lớp mới.Làm thế nào để bắt buộc lớp con gọi một phương thức trừu tượng được thực hiện
Tôi đã viết nó trong hàm tạo của lớp bậc cao một lần, bởi vì tôi muốn nó ép buộc nó cho mỗi lần triển khai.
public abstract class SupahClass {
public SupahClass() {
doStuff(); // It IS executed when the subclass constructor is called
init(); // NOT executed, even though it's implemented
}
private void doStuff() { ... }
protected abstract void init();
}
public class SomeSubClass extends SupahClass {
// The problem lies HERE: this is executed AFTER init() ... so it gets NULL again
private TextBox myTextBox = null;
public SomeSubClass() {
super(); // invokes the super constructor, so init() should be called
// I could call init(); here EACH time i create a new subclass... but no :)
}
@Override
public void init() {
this.myTextBox = new TextBox(); // Executed BEFORE its declared as null above
}
}
Tất nhiên, lớp cha có thể không thực sự gọi nó là từ một bản tóm tắt phương pháp (vì vậy không xác định) của nó, nhưng một lớp trừu tượng của nó nên nó không thể được instanciated, nó phải ủy thác nhiệm vụ để lớp con của nó, vậy tại sao họ không thể gọi phương pháp trừu tượng nhưng hiện nay được thực hiện?
EDIT Xem lớp con sở hữu myTextBox
và init()
thực hiện
Những phương pháp nào bạn nghĩ mình nên làm gì? Xóa = null
trong tuyên bố thuộc tính (duhhh)
hoặc xóa init()
trong lớp cha và gọi rõ ràng trong trình tạo lớp con (đây là những gì tôi muốn tránh vì tôi sẽ phải viết 100% thời gian) ..)
Điều đó sẽ hiệu quả. Đây rõ ràng không phải là mã thực sự của bạn - mã thực của bạn phải khác với mã này theo một số cách quan trọng. Tại sao không đăng mã thực tế của bạn và để chúng tôi có một cái nhìn? –
Thật vậy!xem bình luận của tôi về câu trả lời của Jon Skeet và câu hỏi được cập nhật của tôi :) – dominicbri7