【问题标题】:C# Basics - How do interfaces work and calling implemented interfaceC# 基础 - 接口如何工作和调用实现的接口
【发布时间】: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来检测接口的所有实例。它对你来说是干净的,而不是平台本身
  • 所以这基本上是反射的工作?嗯..这是一个想法..谢谢你。

标签: c# unity3d


【解决方案1】:

自己实现这一点的一种方法是从单个基类派生所有类。这个基类将调用 VIRTUAL 函数OnWhatever()。 [注意:您所有的自定义 Unity 组件类都派生自 Monobehavior。]

然后,当您创建派生类时,您可以简单地使用特定于该组件的版本覆盖虚拟 OnWhatever() 函数。


但是,如果您只想坚持使用接口:您现在可以使用GetComponents < T >GetComponentsInChildren < T > 并为要查找的类型指定一个接口。通过在所有场景的 "root" Objects 上调用 GetCompoentsInChildren < T > () 函数,您可以在界面搜索中走得更远。

然后您可以简单地调用/调用接口指定的OnWhatever() 函数,以获得所有GetComponents < T > 结果。

【讨论】:

    猜你喜欢
    • 2014-06-17
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多