【问题标题】:Interface member name conflicts in ActionScript 3ActionScript 3 中的接口成员名称冲突
【发布时间】:2011-02-10 09:29:03
【问题描述】:

我正在尝试创建一个实现两个接口的 ActionScript 3 类。接口包含具有不同签名但名称相同的成员函数:

public interface IFoo
{
    function doStuff(input:int):void;
}

public interface IBar
{
    function doStuff(input1:String, input2:Number):void;
}

public class FooBar implements IFoo, IBar
{
    // ???
}

在 C#(例如)中,这不是问题,因为方法可以重载,但 ActionScript 不支持重载。有没有办法创建一个实现这两个接口的类?

【问题讨论】:

    标签: actionscript-3 interface language-features


    【解决方案1】:

    public class FooBar 必须实现这两个接口,从而实现列出的那些函数。问题是 ActionScript 不支持方法重载。这是我从 C# 中错过的一个不错的功能:(

    【讨论】:

    • 你是对的;在 C# 中甚至不需要显式接口实现来解决这个问题;简单的方法重载就可以了。我更新了问题以反映这一点。然而,问题是“有没有办法创建一个实现两个接口的类?”所以你的答案并不是真正的答案。
    【解决方案2】:

    不,很遗憾,这是不可能的,这是因为您已经指出的原因:ActionScript 3 不支持成员重载。这是一种耻辱,但这是不幸的事实。

    可以在一个类中拥有多个同名甚至同一个签名的成员,但是,在这种情况下,它们必须由命名空间限定。例如,这应该可以工作:

    public namespace foo;
    public namespace bar;
    
    foo function doStuf(input:int):void
    {
        // ...
    }
    
    bar function doStuff(input1:String, input2:String):void
    {
        // ...
    }
    

    然后,您可以通过像这样限定它们来引用这些方法:

    foo::doStuff(1);
    bar::doStuff("foo", "bar");
    

    不幸的是,这对您的问题没有帮助,因为即使命名空间可能位于公共命名空间中,它们仍然与公共命名空间本身不同,这意味着您不满足接口规定的合同 (一切都必须公开)。长话短说;除非您使用某种复合模式,否则在 Adob​​e 决定实施成员重载之前,您会很不走运。

    【讨论】:

    • 我担心是这样,但感谢您的明确回答。你能用“复合模式”来解释你的意思吗?您的意思是创建两个类,每个接口一个,然后允许它们以某种方式通信或共享状态?
    • 是的,就是这样。为了促进松耦合,我建议您让聚合类处理通信。
    • 恐怕我最后的评论可能在那里不清楚。我的意思是,如果您有两个单独的类,每个接口一个,您可以将它们包装在一个聚合类中,该类存储对这些类的实例的引用并促进它们之间的任何通信。如有必要,可以使用内部命名空间(如果它们在同一个包中)或使用自定义命名空间来共享任何实现细节。这有点像朋友班。这当然不理想,但至少是这样。
    • 已接受答案。我早就忘记了我的项目中最初的问题是什么(显然我找到了解决它的方法),但这似乎是我希望找到的解决这个问题的好方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 2017-08-27
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多