eventキーワードを付けると、そのクラス内でのみデリゲート型の変数(EventHandler)を関数として呼び出すことができる。サブクラスからスーパークラスのEventHandlerを呼びだそうとするとエラーが表示される。
1 2 3 4 5 6 7 8 |
using UnityEngine; using System.Collections; using System; public class EventSuper : MonoBehaviour { public event EventHandler EventMouseDown; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using UnityEngine; using System.Collections; using System; public class EventSub : EventSuper { void OnMouseDown() { if (EventMouseDown != null) { EventMouseDown(this, EventArgs.Empty); } } } |
コンソールに以下の様なエラーが表示される。
Assets/EventSub.cs(9,21): error CS0079: The event
EventSuper.EventMouseDown' can only appear on the left hand side of
+=’ or-=' operator
EventSuper.EventMouseDown’ can only appear on the left hand side of += or -= when used outside of the type
Assets/EventSub.cs(9,21): error CS0070: The eventEventSuper'
EventSuper.EventMouseDown’ can only appear on the left hand side of
Assets/EventSub.cs(11,25): error CS0079: The event+=' or
-=’ operator
Assets/EventSub.cs(11,25): error CS0070: The eventEventSuper.EventMouseDown' can only appear on the left hand side of += or -= when used outside of the type
EventSuper’
継承する場合には、呼び出しをラップしたメソッドを用意して、それを呼び出すようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; using System.Collections; using System; public class EventSuper : MonoBehaviour { public event EventHandler EventMouseDown; protected virtual void OnEventMouseDown() { if (EventMouseDown != null) { EventMouseDown(this, EventArgs.Empty); } } } |
1 2 3 4 5 6 7 8 9 10 |
using UnityEngine; using System.Collections; public class EventSub : EventSuper { void OnMouseDown() { OnEventMouseDown(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using UnityEngine; using System.Collections; using System; public class Main : MonoBehaviour { private EventSub _event; void Start() { _event = GameObject.Find("Cube").GetComponent<EventSub>(); _event.EventMouseDown += handler; } void handler(object sender, EventArgs e) { print("handler()"); } } |
[…] 参考) devlog [naru design] | Unity3D:スーパークラスのeventをサブクラスから呼び出す stackoverflow | Why can’t I invoke PropertyChanged event from an Extension Method? […]