2009-09-08 43 views
6

Trong VB.NET có từ khóa 'bóng tối'. Giả sử tôi có một lớp cơ sở được gọi là 'Jedi' và một lớp dẫn xuất được gọi là 'Yoda' kế thừa từ 'Jedi'. Nếu tôi khai báo một phương thức trong 'Jedi' được gọi là 'ForcePush' và bóng đổ trong 'Yoda' thì khi gọi phương thức trên một thể hiện của lớp 'Yoda', nó sẽ bỏ qua việc triển khai lớp cơ sở và sử dụng lớp thực thi . Tuy nhiên, nếu tôi có một phiên bản 'Yoda' được khai báo ban đầu là kiểu 'Jedi', tức là Dim j as Jedi = new Yoda() và được gọi là phương pháp 'ForcePush' trên cá thể, nó sẽ sử dụng triển khai Jedi.Sự kiện bóng mờ trong .NET

Bây giờ chúng ta hãy nói rằng tôi có một sự kiện được gọi là 'UsingForce' được gọi khi phương thức 'ForcePush' được gọi, và tôi che giấu sự kiện trong lớp dẫn xuất (điều này là vì 'Yoda' có giao diện ' IForcePowers 'tuyên bố sự kiện này) và mỗi lớp làm tăng sự kiện tương ứng của nó.

Nếu tôi có phiên bản 'Yoda' được khai báo là loại 'Jedi' (như trên) và tôi đặt trình xử lý sự kiện vào sự kiện 'Sử dụng' của 'Jedi', sau đó phương pháp 'ForcePush' là được gọi trong lớp 'Yoda', liệu người xử lý sự kiện này có đạt được không?

+1

Đây là một câu hỏi hay. Tôi sẽ sử dụng ví dụ Jedi/Yoda vào lần sau tôi phải giải thích sự thừa kế. – David

+1

David: Tôi đồng ý, nó thật tuyệt vời, thật tuyệt vời đến nỗi nó làm tôi xao lãng từ câu hỏi thực tế và cuối cùng tôi chỉ nghĩ về cuộc chiến giữa các vì sao trong một thời gian. –

+1

Xin lỗi các bạn, tôi sẽ cố gắng và đặt câu hỏi của tôi một chút ít tuyệt vời hơn trong lần tiếp theo! :) – link664

Trả lời

2

Sử dụng từ khóa shadows trong VB.NET có nghĩa là bạn đang khai báo một thành viên hoàn toàn mới tồn tại bên ngoài bất kỳ chế độ thừa kế thừa kế nào tồn tại. Đây là lý do tại sao từ khóa đó (và thực hành liên quan) thường được coi là "có mùi" (mặc dù một số người phản đối thuật ngữ đặc biệt này, tôi thấy nó khá thích hợp). Lý do đằng sau mô hình "che giấu mọi thứ" là gì? Cách tiếp cận này thường được dành riêng cho các trường hợp không có cách nào khác để hoàn thành những gì bạn cần. Kế thừa và ghi đè các phương pháp không phải là một lựa chọn?

Trong mọi trường hợp, nếu bạn "che khuất" sự kiện trong lớp thấp hơn, thì không, không có cách nào có thể cho một lớp ở xa chuỗi thừa kế để kích hoạt sự kiện trực tiếp, vì họ không biết rằng thậm chí tồn tại.

+0

Bạn không thể ghi đè các sự kiện và lý do tôi cần thực hiện nó trong lớp dẫn xuất là vì lớp dẫn xuất sử dụng giao diện cho thấy sự kiện, để khi tôi khai báo và đối tượng kiểu 'IForcePowers' với các sự kiện, Tôi có thể thêm một trình xử lý tĩnh cho đối tượng. – link664

+0

Nếu giao diện khai báo bất kỳ thành viên nào - có thể là hàm, thuộc tính hoặc sự kiện - và thành viên có tên và chữ ký phù hợp đã được triển khai trong lớp thực hiện hoặc trong một trong các lớp cơ sở của nó, thì thành viên đó sẽ tự động được tính vào việc triển khai giao diện. IE, nếu tôi khai báo một giao diện được gọi là IText với một thuộc tính Text được nhập dưới dạng một chuỗi, thì tôi có thể kế thừa từ bất kỳ điều khiển nào và tuyên bố rằng nó triển khai giao diện IText mà không cần bất kỳ mã bổ sung nào, vì thuộc tính Text string đã tồn tại. –

+1

@AdamRobinson: Không. Bạn phải xác định rõ ràng thuộc tính phơi sáng chuỗi được cho là thực hiện giao diện/thành viên được đề cập với từ khóa 'Implements' (trong trường hợp này được theo sau bởi' IText.Text'). Đó là vấn đề - và vấn đề là cụ thể đối với các sự kiện (vì chúng không thể được khai báo là 'Overridable'), vì vậy việc sử dụng các phương thức hoặc thuộc tính như các ví dụ là gây hiểu nhầm. – d7samurai

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