2010-01-31 33 views
6

Tôi có một nghi ngờ về lớp HttpServlet là một lớp trừu tượng mặc dù không có bất kỳ phương thức trừu tượng nào trong lớp, tất cả các phương thức đều là cụ thể. Lớp học có thể trừu tượng ngay cả khi không có bất kỳ phương pháp trừu tượng nào không? Nếu có, Whats sử dụng?Lớp học có thể trừu tượng ngay cả khi không có bất kỳ phương pháp trừu tượng nào không? Nếu có, Whats sử dụng?

Cảm ơn

+0

Xem thêm http://stackoverflow.com/questions/362446/abstract-class-with-all-concrete-methods –

Trả lời

18

Trong trường hợp HttpServlet, điểm là các lập trình viên servlet thường không muốn servlet của họ hỗ trợ tất cả 4 phương thức HTTP chính (POST, GET, PUT, DELETE), do đó sẽ gây khó chịu khi thực hiện doGet(), doPost(), v.v. phương pháp trừu tượng, vì người lập trình sẽ buộc phải triển khai các phương thức mà họ không cần. Do đó, HttpServlet cung cấp triển khai mặc định cho tất cả các phương thức không thực hiện gì ngoại trừ trả lại mã trạng thái lỗi cho ứng dụng khách. Các lập trình viên có thể ghi đè lên các phương thức mà họ cần và không phải lo lắng về phần còn lại. Nhưng thực sự sử dụng lớp HttpServlet không có ý nghĩa (vì nó không có gì hữu ích), vì vậy nó là abstract.

Và ở đó bạn có một ví dụ tuyệt vời về thời điểm có thể có một lớp trừu tượng mà không có bất kỳ phương pháp trừu tượng nào.

+0

Nó thực sự là một ví dụ tuyệt vời. Nó cũng được gọi là mẫu Phương thức mẫu. – BalusC

6

Không thể khởi tạo lớp trừu tượng để bạn phải phân lớp chúng để sử dụng nó.
Trong lớp con, bạn vẫn có thể triển khai các phương thức của riêng mình hoặc ghi đè lên các phương thức cha mẹ.

Có thể không có ý nghĩa khi sử dụng HttpServlet là độc lập, nhưng nó cung cấp chức năng mặc định cần thiết trong một ngữ cảnh nhất định. Bạn có thể phân lớp HttpServlet để phục vụ ngữ cảnh này và có quyền truy cập vào chức năng của nó.

Một lớp con của HttpServlet không phải triển khai các phương pháp để làm cho chức năng của riêng nó hoạt động.

3

Đó là vấn đề. Nếu lớp là trừu tượng, bạn không thể tạo một thể hiện của lớp đó - chỉ của một lớp con.

Tôi không mạnh trên Java, nhưng tôi đoán là HttpServlet cung cấp triển khai mặc định các phương pháp của nó, nhưng bạn dự kiến ​​sẽ ghi đè một số trong số chúng. Nó vẫn còn ít ý nghĩa để có một thể hiện không đặc biệt của lớp đó, do đó, nó trừu tượng để trình biên dịch giảm một gợi ý cho bất cứ ai cố gắng.

+0

+1, Hành vi mặc định của phương pháp 'HttpServlet' sẽ dẫn đến * rất * web nhàm chán các trang ... –

+0

Chắc chắn không nhàm chán như http://www.cavaliers.org/john/boring.html? – Steve314

2

Đánh dấu lớp là trừu tượng ngay cả khi có triển khai cụ thể cho tất cả các phương pháp sẽ hữu ích trong trường hợp bạn không chắc chắn thiết kế lớp đã hoàn thành hay có cơ hội bạn dự định thêm một số phương thức sau. Thay đổi một lớp đã được khai báo trừu tượng sẽ không được trừu tượng sau đó sẽ không phá vỡ khả năng tương thích với các tệp nhị phân đã tồn tại trước đó, như cách phá vỡ khả năng tương thích theo cách khác.

Các vấn đề liên quan