Tôi có một cấu trúc lớp mà tôi muốn một số phương thức trong một lớp cơ sở có thể truy cập được từ các lớp được lấy trực tiếp từ lớp cơ sở, nhưng không phải các lớp bắt nguồn từ các lớp dẫn xuất. Theo đặc tả Java Language, có thể ghi đè các đặc tả truy cập trên các phương thức kế thừa để làm cho chúng trở nên công khai hơn, nhưng không phải riêng tư hơn. Ví dụ: đây là ý chính của những gì tôi cần làm, nhưng là bất hợp pháp:Có thể ẩn hoặc giảm quyền truy cập vào Phương thức kế thừa trong Java không?
// Defines myMethod
public class Base {
protected void myMethod() {}
}
// Uses myMethod and then hides it.
public class DerivedOne extends Base {
@Override
private void myMethod();
}
// can't access myMethod.
public class DerivedTwo extends DerivedOne {
}
Có cách nào để thực hiện việc này không?
Được chỉnh sửa để giải thích lý do tôi muốn thực hiện việc này:
Trong trường hợp này cấu trúc lớp là cấu trúc xử lý và nhập dữ liệu. Nó đọc và phân tích các tệp văn bản đầy đủ dữ liệu dạng bảng và sau đó lưu trữ chúng trong cơ sở dữ liệu.
Lớp cơ sở là lớp bảng cơ sở quản lý phần xử lý cơ sở dữ liệu của nó. Có một số lượng khá lớn các chức năng chứa trong đó là điều phổ biến đối với tất cả các loại bảng - như khi chúng ở trong cơ sở dữ liệu, chúng trở nên đồng nhất.
Lớp trung lưu dành riêng cho loại bảng trong tệp đang được phân tích cú pháp và có phân tích bảng và logic nhập. Nó cần truy cập vào một số hàm truy cập cơ sở dữ liệu của lớp cơ sở.
Lớp cấp cao nhất dành riêng cho bảng và không có gì khác ngoài việc khởi tạo bố cục của bảng theo cách mà lớp cha mẹ có thể hiểu. Ngoài ra người dùng của lớp cơ sở không cần phải xem hoặc truy cập các hàm cơ sở dữ liệu cụ thể mà lớp trung lưu làm. Về bản chất, tôi muốn tiết lộ các chức năng này chỉ ở một cấp trên lớp cơ sở và không có ai khác.
Tôi hỏi vì, mặc dù mã tôi đăng dưới dạng ví dụ là bất hợp pháp, có thể có một số phương tiện khác để thực hiện cùng một kết thúc. Tôi hỏi nếu có.
Có lẽ ẩn là cách sai để cụm từ này - những gì tôi thực sự cần làm là phơi bày một số chức năng cần được riêng tư cho lớp cơ sở đến lớp một cấp trong hệ thống phân cấp. Ẩn sẽ thực hiện điều này - nhưng tôi có thể thấy cách ẩn náu sẽ là một vấn đề. Có một cách khác để làm điều này?
Kể từ DerivedOne là một Base, nó phải chứa đến hợp đồng cơ sở của. Điều này bằng cách này, là lý do tại sao phái đoàn (mô hình hỗn hợp) thường được ưa thích hơn thừa kế. –
@Steve Tôi không tin mẫu ghép sẽ hoạt động ở đây. Về bản chất tôi chỉ cần tiết lộ một số chức năng mà nên được tư nhân cho lớp cơ sở đến một lớp đó là một cấp lên. –
Đã cập nhật câu trả lời của tôi. – rsp