2016-11-13 65 views
4

在这个问题中,我提到Unity3D,但通常在c#中应用。如果我扩展一个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节想:))

+0

这是一个非常有趣的问题创建一个密封的抽象类。我会试验看看这是否可能。 – Programmer

+0

[PointerEventData](https://docs.unity3d.com/ScriptReference/EventSystems.PointerEventData.html)有[used](https://docs.unity3d.com/ScriptReference/EventSystems.AbstractEventData-used.html)成员。你可以将它设置为“true”来阻止其他任何反应吗? – ChrisF

+0

嗨@ChrisF - 呃..我的意思是,在哪里?! (另外,我想 - 在“一般C#问题”情况下不会真的有帮助......我想。) – Fattie

回答

4

答案很简单:第

可能的解决方案:

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

  2. 与非虚方法

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

谢谢你的确 - 通常清楚的“不”是最有用的答案。 – Fattie

+0

阅读此文的人可能会喜欢我的有点相关的问题http://stackoverflow.com/questions/40576493(但是,它只与Unity有关,而不是一般的C#)。 – Fattie

+0

我也投了赞成票。如果声明了该接口,则意味着该接口对于该对象正常工作而言是有意义的。如果应该有一个幽灵方法,那么有些事情是错误的。 – Everts

相关问题