【问题标题】:If I extend a c# interface, can I eat a call?如果我扩展一个 c# 接口,我可以吃一个调用吗?
【发布时间】:2016-11-14 01:05:54
【问题描述】:

在这个问题中,我提到了 Unity3D,但通常适用于 c#。

Unity3D 有一个看起来像这样的界面 ..

public class SomeRobot:MonoBehaviour, IPointerDownHandler
    {
    public void OnPointerDown(PointerEventData data)
        {
        Debug.Log("Gets called whenever someone touches the screen...");
        }

目前没有问题。

我自己做界面..

public interface IFUHandler:IPointerDownHandler
    {
    void OnBlah (PointerEventData data);
    }

假设我有一个守护进程或任何调用 OnBlah 的接口的使用者。

public class SomeRobot:MonoBehaviour, IFUHandler
    {
    public void OnBlah(PointerEventData data)
        {
        Debug.Log("Gets called when blah happens...");
        }

目前没有问题。但是

public class SomeRobot:MonoBehaviour, IFUHandler
    {
    public void OnBlah(PointerEventData data)
        {
        Debug.Log("Gets called when blah happens...");
        }
    public void OnPointerDown(PointerEventData data)
        {
        Debug.Log("this DOES still get called also...");
        }

事实上,OnPointerDown 仍然会被调用。这是有道理的。

但是 .... 有没有办法让我的接口吃掉对 OnPointerDown 的调用?

所以订阅IFUHandler 的消费者实际上没有收到对OnPointerDown 的调用?

(但当然会收到我的OnBlah 电话。)

或者我只是在忍受“TMIOOK”的想法? (把我自己绑在 OO 结的思想里 :))

【问题讨论】:

  • 这是一个非常有趣的问题。我会尝试看看这是否可能。
  • PointerEventData 有一个 used 成员。您可以将其设置为 true 以阻止其他任何反应吗?
  • 嗨@ChrisF - 好吧..我的意思是,在哪里?! (另外,我想这在“一般 c# 问题”的情况下并没有真正的帮助......我认为。)
  • @JoeBlow - 是的。尽管在一般情况下,许多事件确实具有“已处理”属性。
  • @JoeBlow 你想达到什么目的?

标签: c# unity3d interface


【解决方案1】:

简单的回答:不。

可能的解决方案:

  1. 不要在不需要的时候继承IPointerDownHandler。如果你不打算使用它,为什么需要这个接口?

  2. 使用非虚方法创建密封抽象类

    public class BaseFUHandler : MonoBehaviour, IFUHandler
    {
    
    public abstract void OnBlah(PointerEventData data);
    
    public void OnPointerDown(PointerEventData data)
    {
        //Gets called, but nothing hapends.
    }
    

【讨论】:

  • 谢谢你 - 确实,一个明确的“不”通常是最有用的答案。
  • 任何阅读本文的人都可能会喜欢我的一些相关问题stackoverflow.com/questions/40576493(但是,它仅与 Unity 相关,一般与 c# 无关)。
  • 我也投反对票。如果声明了该接口,则应该意味着该接口对于该对象正常工作是有意义的。如果应该有鬼方法,那就有问题了。
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2010-10-13
  • 2016-11-21
  • 1970-01-01
相关资源
最近更新 更多