【发布时间】:2018-12-24 19:44:55
【问题描述】:
我迫切需要有人向我解释以下案例以及它是如何“在幕后”工作的。这将帮助我更深入地理解这个概念。
统一案例:
在 Unity3D 引擎中,如果我们想要检测对 UI 元素的点击,我们只需在我们的自定义类中实现一个名为“IPointerClickHandler”的预制接口。
public void OnPointerClick(PointerEventData eventData)
{
// Do whatever you want in here, when you detect click on UI element
}
脚本需要附加到每个单独的元素,但归根结底,它就像一个魅力。
我的情况:
这对我来说很有趣,因为我不确定 Unity 是如何知道我的类实现了它的一个接口并调用了适当的方法。
我想做一个类似的把戏,但我不知道怎么做。例如,我想通知所有实现“IScore”侦听器的类,该侦听器具有“OnScoreChanged(float newScore)”方法;
public float Score;
public interface IScore {
void OnScoreChanged(float newScore);
}
public void SetScore(int newScore) {
Score = newScore;
//Notify all classes that implement IScore interface
// .OnScoreChanged(newScore);
}``
我可能需要一个引用,所以我的想法是获取对实现“OnScoreChanged”的类的所有引用。上面的例子是正确的方法吗?我怎样才能让它发挥作用?基本上,我想在需要获得新分数通知的类中实现此接口,并完全忘记如何调用此方法。这样的事情可能吗?
public class MyClassB: IScore {
public void OnScoreChanged(float newScore)
{
// This just got called after score
//changed..and without any additional implementation!
}
}
P.S 我知道我可以将委托与事件一起使用(然后从其他类订阅此事件),但我真的很好奇 Unity 如何只调用接口方法并保持代码更简洁(所以用户不t 订阅其事件等)。
【问题讨论】:
-
谷歌:“依赖注入”
-
@vzwick 这似乎与“依赖注入”无关。“基本上,我想在需要获得新分数通知的类中实现这个接口,完全忘记了这个方法是如何实现的被调用。这样的事情可能吗?”
-
"谁告诉你 Unity 的代码是干净的?"实际上没有人,但看起来确实如此。我只需要实现接口并在方法中做一些事情就可以让它工作。但是,我真的不知道它为什么以及如何“在幕后”工作。
-
基本上Unity使用了很多Reflection来检测接口的所有实例。它对你来说是干净的,而不是平台本身
-
所以这基本上是反射的工作?嗯..这是一个想法..谢谢你。