Khi tôi tạo lớp tùy chỉnh Android của riêng mình, tôi là extend
lớp gốc của nó. Sau đó, khi tôi muốn ghi đè lên các phương pháp cơ bản, tôi luôn gọi super()
phương pháp, giống như tôi luôn luôn làm trong onCreate
, onStop
vv
Và tôi nghĩ đây là nó, vì ngay từ đầu nhóm Android đã khuyên chúng tôi nên luôn super
ghi đè mọi phương thức.
Tuy nhiên, trong nhiều cuốn sách, tôi có thể thấy rằng các nhà phát triển, có kinh nghiệm hơn bản thân tôi, thường bỏ qua việc gọi điện super
và tôi thực sự nghi ngờ họ làm như vậy là thiếu kiến thức. Ví dụ, nhìn vào cơ bản này SAX lớp phân tích cú pháp nơi super
được bỏ qua trong startElement
, characters
và endElement
:
public class SAXParser extends DefaultHandler{
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("XXY")) {
//do something
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
//do something
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equalsIgnoreCase("XXY")) {
//do something
}else () {
//do something
}
}
}
Nếu bạn cố gắng tạo bất kỳ phương thức ghi đè nào thông qua Eclipse hoặc bất kỳ IDE nào khác, super
sẽ luôn được tạo như một phần của quy trình tự động.
Đây chỉ là một ví dụ đơn giản. Sách có đầy đủ các mã tương tự .
Làm thế nào để họ biết khi nào bạn phải gọi super
và khi nào bạn có thể bỏ qua cuộc gọi?
Tái bút. Không ràng buộc với ví dụ cụ thể này. Đó chỉ là một ví dụ được chọn ngẫu nhiên từ nhiều ví dụ.
(Điều này nghe có vẻ giống như một câu hỏi dành cho người mới bắt đầu, nhưng tôi thực sự bối rối.)
endElement
Tài liệu API của nói "Theo mặc định, không làm gì cả. Người viết ứng dụng có thể ghi đè phương thức này ..." có nghĩa là bạn có thể gọi super một cách an toàn vì nó "không có gì" nhưng bạn không cần phải làm như vậy và bạn thực sự có thể ghi đè nó. Bạn thường có thể biết mình phải / có thể / không nên làm điều đó nếu bạn đọc tài liệu về phương pháp đó.