AS3:如何组织我的api实现的类?

时间:2012-05-10 10:47:31

标签: actionscript-3 oop

我正在开发一个与我的服务器交互的Air应用程序。有很多与不同科目有关的方法。

为了构建它,我引入了一个主'API'对象及其中的几个扩展器,每个都实现了特定Subject的方法。它们中的每一个都使用实际调用服务器的主API _call方法。

如何设置主API,以便我可以像这样引用其子代:

var Api:myMasterApi = Application.getApi();

// Now do the API calls:
Api.Subject1.Method1();
Api.Subject2.Method3();

我尝试将MasterApi公共静态属性设置为实例化的子类,可能是以错误的方式:

class myMasterApi {
    public static Subject1:mySubject1 = new mySubject1();
    public static Subject2:mySubject2 = new mySubject2();

    protected function _call( args... ) { /* does the call */ }
}

扩展器就像这样:

class mySubject1 extends myMasterApi {
    public function Method1( args... ) {
        prepare things;
        this._call( args ); // do the call
    }
}

这是API的结构化实现的正确方法,还是我走错了路?

我遇到的问题是当Api.Subject1不是static时,它会通过循环自引用创建堆栈溢出:因为它的基类有Subject1作为属性。

当Api.Subject1为static时,它会给出错误1119:“通过静态类型的引用访问可能未定义的属性...”

2 个答案:

答案 0 :(得分:2)

您正在混合两种不同的基本OOP概念:组合和继承。对于您的特定Subject类扩展MasterApi(继承)并且MasterApi包含其每个后代的实例,可能没有任何意义。它循环。

您可能想要做的是拥有一个基础Subject类,每个特定的Subjects扩展,以便他们都可以使用一些常用方法,然后让您的{{1}是一个不相关的类,它包含每个特定MasterApi的单例实例。

'单例'只是一个术语含义"它是一个实例(不是一个静态类),但只有其中一个"。这正是您通过声明Subjects属性并将其设置为特定static类的新实例而获得的。

准系统示例(不包括Subject语句等)。我不知道你的"科目"所以我只是提出一些组成的属性:

imports

答案 1 :(得分:0)

您希望Subject1Subject2是静态的吗?如果是这样,myMasterApi.Subject1就是你如何获得这些静态项目。

相反,您可能希望从定义中删除静态,一切都应该适合您。