Я изучаю интерфейсы и события, и пока все хорошо, но я застрял на одной проблеме.
В мои дни использования интерфейсов C # я привык объявлять, какой интерфейс использовать, затем реализовывать связанные методы, и они получают автоматические обратные вызовы всякий раз, когда происходит событие.
Например, Unity's IPointerClickHandler :
using UnityEngine; using UnityEngine.EventSystems;
public class Example : MonoBehaviour, IPointerClickHandler {
//Detect if a click occurs
public void OnPointerClick(PointerEventData pointerEventData)
{
//Output to console the clicked GameObject's name and the following message. You can replace this with your own actions for when clicking the GameObject.
Debug.Log(name + " Game Object Clicked!");
} }
Теперь, рассматривая примеры использования событий и интерфейсов, я нахожу следующие примеры:
Класс и интерфейс издателя
using UnityEngine;
using System.Collections;
public class Publisher : MonoBehaviour
{
public delegate void ClickAction();
public static event ClickAction OnClicked;
void Start()
{
OnClicked();
}
}
public interface IBallManager
{
void Teleport();
}
Абонентский класс:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Subscriber : MonoBehaviour, IBallManager
{
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnEnable()
{
Publisher.OnClicked += Teleport;
}
void OnDisable()
{
Publisher.OnClicked -= Teleport;
}
public void Teleport()
{
Debug.Log("EventTriggered");
}
}
У меня следующий вопрос: как мне создать интерфейс, в котором мне не нужно вручную подписываться и отписываться от события? Есть ли способ реализовать интерфейс и не нужно использовать Publisher.OnClicked + = Teleport; & Publisher.OnClicked - = Телепорт; в каждом классе, где я использую IBallManager? Просто реализуя интерфейс и получая автоматические обратные вызовы при возникновении события, как в IPointerClickHandler в Unity.
Заранее спасибо!