注意:在这个问题中,我说的是正式的接口(例如公共接口IButton {...})。
我是一个Actionscript开发人员,但我怀疑我的问题会在允许正式接口和事件的许多语言中引起共鸣。
我喜欢Interfaces。我喜欢界面和实现之间的分离。 (我希望Actionscript强制每个类实现一个正式的接口,就像Objective-C那样。)我的所有类都实现了一个接口(或几个),你永远不会发现我编写的公共方法比没有引用界面。
但是Actionscript也严重依赖于事件。我的问题是这样的:与外部类或进程通信的类的每个部分都是(或应该是)其接口的一部分。 (我意识到这是一个意见问题。如果你不同意,这个问题对你来说可能毫无意义。)
有几种方法可以弄清楚这张清晰的画面,但大部分都是可以避免的:
您无法在界面中列出公共属性。解决方案:不要在类中使用公共属性。使用getter和setter(我也不是那么疯狂,但我必须使用它们。)
如果类通过将参数传递给构造函数进行通信,那么这些消息会绕过接口,因为您无法在接口中列出构造函数。我通过(几乎)从不通过构造函数传递参数来避免这个问题。我更喜欢可以在Interfaces中显式化的init()方法。
类可以具有未在接口中列出的公共方法。我没有这样做,我避免这样做。我的类实现了接口。这些接口包含所有公共方法的标题。
许多课程调度事件。
最后一个是杀手。
假设我给你一个名为Blah的课程,你问我该如何使用它。我可以告诉你,“它实现了IBlah界面。看看那个,你会看到你可以用Blah做的一切。”
除了Blah扩展EventDispatcher,这意味着它调度事件。
“它发送什么事件?”你问。
“嗯...”
要知道,您必须检查JavaDoc或阅读Blah的源代码。你不应该这样做!您应该能够通过检查其接口知道如何与类进行交互。
我希望接口看起来像这样:
public interface IBlah
{
function foo() : void;
function bar() : Boolean;
event BlahEvent;
}
但您无法在界面中指定事件。
我是对的,事件会破坏接口吗?对我来说,好像我给了你一辆车并说这是手册。在手册中,它可以解释仪表板上的所有内容。但是,当你驾驶汽车时,出现奇怪的dohickies并发出奇怪的声音 - 手册中没有提到的事件。
如果我错了,请解释一下。
如果我是对的,有没有办法避免这个问题?
答案 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)是可选的。这是一个实现细节。
我不喜欢它,因为它是一个黑客。一个公共方法可以调用但很无用,除非它被它的宿主类调用和实例。