Dưới đây là một phiên bản đơn giản của lớp học của tôi:Lớp cơ sở có thể xác định xem một lớp dẫn xuất đã ghi đè thành viên ảo không?
public abstract class Task
{
private static object LockObject = new object();
protected virtual void UpdateSharedData() { }
protected virtual void UpdateNonSharedData() { }
public void Method()
{
lock(LockObject)
{
UpdateSharedData();
}
UpdateNonSharedData();
}
}
Tôi đang cố gắng để che giấu mã khóa từ các lớp học có nguồn gốc. Nhưng tôi chỉ muốn lấy khóa nếu lớp dẫn xuất ghi đè UpdateSharedData; nếu không, tôi không muốn phương thức chặn và chờ trên tất cả các cá thể đang chạy khác cập nhật dữ liệu được chia sẻ trước khi cập nhật dữ liệu không được chia sẻ.
Vì vậy, điều dường như (dường như) đối với Phương thức cần làm là kiểm tra xem liệu việc triển khai UpdateSharedData của cá thể hiện tại có làm quá tải việc triển khai lớp cơ sở hay không. Tôi khá chắc chắn điều này là không thể nếu không sử dụng sự phản chiếu, và có lẽ không phải là điều mong muốn để làm điều đó.
Tôi đã nghĩ về một số biện pháp khắc phục điều này, nhưng tất cả họ đang khá lúng túng:
- Thêm một tài sản bool bảo vệ rằng bộ constructor lớp được thừa kế, và kiểm tra tài sản đó để xem nếu một khóa là cần thiết. Đó là làm một công việc khá khủng khiếp để ẩn mã khóa khỏi các lớp dẫn xuất.
- Đặt phương thức UpdateSharedData thành thuộc tính ủy nhiệm, có bất kỳ lớp dẫn xuất nào được đặt thuộc tính cho phương thức riêng tư trong hàm tạo của nó và chỉ lấy khóa nếu đại biểu không rỗng. Đó là tốt hơn, nhưng nó vẫn là loại hút.
Tôi chỉ nhận ra rằng IHasSharedData trông rất giống mã LOLCats. :-) ICanHazSharedData? – tvanfosson
Đó là điều đầu tiên tôi nhận thấy! Sẽ rất khó cho tôi để chống lại việc đặt cho nó một cái tên như thế. Đây chính xác là câu trả lời mà tôi đang tìm kiếm. –