1

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

为了构建它,我介绍了一个主“API”对象和它的几个扩展器,每个扩展器都实现了特定主题的方法。_call他们每个人都使用实际调用服务器的主 API方法。

如何设置主 API,以便我可以像这样引用它的子 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:“通过静态类型的引用访问可能未定义的属性帖子......”

4

2 回答 2

2

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

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

'Singleton' 只是一个术语,意思是“它是一个实例(不是静态类),但只有其中一个”。这正是您通过声明static属性并将它们设置为特定Subject类的新实例所得到的。

一个准系统示例(不包括imports语句等)。我不知道您的“主题”是什么,所以我只介绍一些虚构的属性:

class SubjectBase {
    private var _name:String;
    private var _description:String;

    public function SubjectBase() {  }

    protected function loadSubject(subjectID:String):void {
        var qResult:Object = SomeClass.SomeMethodThatQueriesYourServer(subjectID);
        _name = qResult["SUBJECT_NAME"];
        _description = qResult["SUBJECT_DESC"];
    }

    public function get name():String {
        return _name;
    }

    public function get description():String {
        return _description;
    }
}

class Subject1 extends SubjectBase {
    public function Subject1() {
        super();
        loadSubject("SUBJECT1");
    }
}

class Subject2 extends SubjectBase {
    public function Subject2() {
        super();
        loadSubject("SUBJECT2");
    }
}

class MasterApi {
    private static _subject1:Subject1 = new Subject1();
    private static _subject2:Subject2 = new Subject2();
    public function MasterApi() { }
    public static function get subject1():Subject1 { return _subject1; }
    public static function get subject2():Subject2 { return _subject2; }
}
于 2012-05-10T12:24:40.620 回答
0

你想要Subject1并且Subject2是静态的吗?如果myMasterApi.Subject1是这样,您如何获得这些静态项目。

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

于 2012-05-10T11:01:21.133 回答