Tôi có một lớp cơ sở DockedToolWindow: Biểu mẫu và nhiều lớp bắt nguồn từ DockedToolWindow. Tôi có một lớp container chứa và gán các sự kiện cho các đối tượng DockedToolWindow, tuy nhiên tôi muốn gọi các sự kiện từ lớp con.Tăng sự kiện cơ bản trong các lớp học có nguồn gốc C#
Tôi thực sự có câu hỏi về cách triển khai những gì mà MSDN site này đang yêu cầu tôi thực hiện. Phần dưới đây được đưa ra cho tôi những vấn đề:
// The event. Note that by using the generic EventHandler<T> event type
// we do not need to declare a separate delegate type.
public event EventHandler<ShapeEventArgs> ShapeChanged;
public abstract void Draw();
//The event-invoking method that derived classes can override.
protected virtual void OnShapeChanged(ShapeEventArgs e)
{
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<ShapeEventArgs> handler = ShapeChanged;
if (handler != null)
{
handler(this, e);
}
}
chắc ví dụ này biên dịch và các công trình, nhưng khi tôi thay thế "ShapeChanged" với "Move" (một sự kiện tôi có được từ phát sinh từ Mẫu), nó lỗi nói rằng tôi không thể di chuyển bên phải mà không cần + = hoặc - =. Tôi cũng đã xóa các thẻ chung của ShapeEventArgs.
Bất kỳ nghi ngờ nào về lý do tại sao tính năng này không hoạt động? Sự khác nhau giữa sự kiện được khai báo trong lớp học và sự kiện được kế thừa là gì?
Tôi thấy rằng OnMove() sẽ giải quyết điều này, tuy nhiên làm thế nào không thể gọi OnMove() explicity khi nó cần thiết tôi có thể? Tôi không biết khung thực sự gọi là đại biểu Di chuyển, và có lẽ là ẩn từ tôi anyway. – Balk
OnMove kích hoạt sự kiện Move, giống như cách OnShapeChanged kích hoạt sự kiện ShapeChanged trong mã của bạn. Đây là một mô hình phổ biến để thêm các thành viên được bảo vệ để kích hoạt các sự kiện, làm cho chúng hiển thị với các lớp dẫn xuất. Trong trường hợp đó, tiền tố "On" thường được thêm vào (OnMove, OnClick, v.v.) – Groo
Để xem nơi khung thực sự kích hoạt sự kiện Move, hãy sử dụng công cụ Reflector (http://www.red-gate.com/products/reflector /) để lấy mã nguồn cho phương thức Form.OnMove. – Groo