Nó phụ thuộc vào thiết kế của lớp cơ sở. Giả sử bạn có một lớp cơ sở
class Stream {
public:
virtual bool canSeek() = 0;
virtual void seek(int offset) = 0;
};
Lưu ý: ví dụ này xuất phát từ NET thế giới, nơi mà các lớp cơ sở thư viện Stream
lớp thực sự có một CanSeek
tài sản ảo như vậy. Tôi không muốn thảo luận xem đây có phải là thiết kế tốt hay không, vì tôi có thể thấy các đối số hợp lệ cho cả hai bên. Nó đủ cho rằng các lớp cơ sở như vậy tồn tại trong thực tế.
Bây giờ, một lớp dẫn xuất có thể xác định rằng
class SpecificStream final : Stream {
private:
virtual bool canSeek() { return false; }
virtual void seek(int offset) { throw "no seek for you"; }
}
Trong lớp có nguồn gốc này, thực tế là seek
được thực hiện ở tất cả là bởi vì nó được yêu cầu về mặt kỹ thuật. Tuy nhiên, bất kỳ mã nào tương ứng với mã này SpecificStream
đã biết rằng hàm seek
hoàn toàn vô dụng với lớp này và không nên được gọi. Khi mã hóa với lớp cơ sở Stream
, bạn có thể kiểm tra kết quả của canSeek()
và gọi seek
chỉ khi kết quả là đúng. Khi mã hóa với lớp SpecificStream
, việc kiểm tra canSeek()
là không hợp lý, vì kết quả của nó được biết đến tĩnh và chắc chắn không có ý nghĩa khi gọi seek()
. Nếu các cuộc gọi như vậy sẽ là một lỗi lập trình viên, nó có ý nghĩa để giúp trình biên dịch cung cấp các thông điệp hữu ích cho các cuộc gọi như vậy.
Sau đó, một lần nữa, Java không cấm điều gì. –