事件会破坏接口吗?

时间:2009-10-14 01:19:08

标签: events actionscript interface

注意:在这个问题中,我说的是正式的接口(例如公共接口IButton {...})。

我是一个Actionscript开发人员,但我怀疑我的问题会在允许正式接口和事件的许多语言中引起共鸣。

我喜欢Interfaces。我喜欢界面和实现之间的分离。 (我希望Actionscript强制每个类实现一个正式的接口,就像Objective-C那样。)我的所有类都实现了一个接口(或几个),你永远不会发现我编写的公共方法比没有引用界面。

但是Actionscript也严重依赖于事件。我的问题是这样的:与外部类或进程通信的类的每个部分都是(或应该是)其接口的一部分。 (我意识到这是一个意见问题。如果你不同意,这个问题对你来说可能毫无意义。)

有几种方法可以弄清楚这张清晰的画面,但大部分都是可以避免的:

  1. 您无法在界面中列出公共属性。解决方案:不要在类中使用公共属性。使用getter和setter(我也不是那么疯狂,但我必须使用它们。)

  2. 如果类通过将参数传递给构造函数进行通信,那么这些消息会绕过接口,因为您无法在接口中列出构造函数。我通过(几乎)从不通过构造函数传递参数来避免这个问题。我更喜欢可以在Interfaces中显式化的init()方法。

  3. 类可以具有未在接口中列出的公共方法。我没有这样做,我避免这样做。我的类实现了接口。这些接口包含所有公共方法的标题。

  4. 许多课程调度事件。

  5. 最后一个是杀手。

    假设我给你一个名为Blah的课程,你问我该如何使用它。我可以告诉你,“它实现了IBlah界面。看看那个,你会看到你可以用Blah做的一切。”

    除了Blah扩展EventDispatcher,这意味着它调度事件。

    “它发送什么事件?”你问。

    “嗯...”

    要知道,您必须检查JavaDoc或阅读Blah的源代码。你不应该这样做!您应该能够通过检查其接口知道如何与类进行交互。

    我希望接口看起来像这样:

    public interface IBlah
    {
        function foo() : void;
        function bar() : Boolean;
        event BlahEvent;
    }
    

    但您无法在界面中指定事件。

    我是对的,事件会破坏接口吗?对我来说,好像我给了你一辆车并说这是手册。在手册中,它可以解释仪表板上的所有内容。但是,当你驾驶汽车时,出现奇怪的dohickies并发出奇怪的声音 - 手册中没有提到的事件。

    如果我错了,请解释一下。

    如果我是对的,有没有办法避免这个问题?

4 个答案:

答案 0 :(得分:0)

我认为您缺少的是事件是完全可选的。当您实例化一个必须处理它引发的所有事件的类时,没有规则说明。您可以(如果您的实现要求它)完全忽略由对象引发的任何事件。此外,只是定义和事件没有说明何时或是否实际上会被提出。因此,在接口中放置一个事件是没有用的,因为当在一个对象中实现接口时,无法定义何时或是否引发了事件。

答案 1 :(得分:0)

除了我的评论之外,我认为您可以在IBlah界面中声明函数标题,例如dispatchMouseDownEvent(当然需要参数)并在Blah中实现它们以发送鼠标下来的事件。现在,不是从方法调度鼠标按下事件,而是从该方法调用dispatchMouseDownEvent。只需确保不要从班级中的任何其他地方发送鼠标按下事件。

答案 2 :(得分:-1)

EventDispatcher实现IEventDispatcher,接口可以扩展其他接口。所以你可以这样做:

public interface IButton extends IEventDispatcher
{
}

现在,IButton

上提供了IEventDispatcher方法

编辑:此外,关于第2点,如果给出了工厂接口,则该类不必使用构造函数。

编辑:关于第1点,字段(无获取/设置)是数据。接口仅描述行为而不描述实现。在界面上有一个字段,要求你将它作为一个字段实现。

答案 3 :(得分:-1)

这是一种方法:

    package
    {
        public interface IMortal
        {
            function stabMe() : void;
            function dispatchDeathEvent() : void
        } 
    }

    package
    {
        import flash.events.EventDispatcher;
        import flash.events.Event;

        public class Person extends EventDispatcher implements IMortal
        {
            private var _dispatchesAllowed : Boolean = false;
            private var _lifeForce : Number = 10;

            public function stabMe() : void
            {
                if ( --_lifeForce == 0 ) iAmDead();
            }

            private function iAmDead()  : void
            {
                _dispatchesAllowed = true;
                dispatchDeathEvent();
            }

            public function dispatchDeathEvent() : void
            {
                if ( _dispatchesAllowed ) 
                    dispatchEvent( new Event( Event.COMPLETE ) );
                    _dispatchesAllowed = false;
            }
        }

    }

我喜欢这个,因为(a)它列出了界面中的事件,(b)从外部锁定事件(_dispatchesAllowed)是可选的。这是一个实现细节。

我不喜欢它,因为它是一个黑客。一个公共方法可以调用但很无用,除非它被它的宿主类调用和实例。