我正在开发一个与我的服务器交互的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:“通过静态类型的引用访问可能未定义的属性...”
答案 0 :(得分:2)
您正在混合两种不同的基本OOP概念:组合和继承。对于您的特定Subject
类扩展MasterApi
(继承)并且MasterApi
包含其每个后代的实例,可能没有任何意义。它是循环。
您可能想要做的是拥有一个基础Subject
类,每个特定的Subjects
扩展,以便他们都可以使用一些常用方法,然后让您的{{1}是一个不相关的类,它包含每个特定MasterApi
的单例实例。
'单例'只是一个术语含义"它是一个实例(不是一个静态类),但只有其中一个"。这正是您通过声明Subjects
属性并将其设置为特定static
类的新实例而获得的。
准系统示例(不包括Subject
语句等)。我不知道你的"科目"所以我只是提出一些组成的属性:
imports
答案 1 :(得分:0)
您希望Subject1
和Subject2
是静态的吗?如果是这样,myMasterApi.Subject1
就是你如何获得这些静态项目。
相反,您可能希望从定义中删除静态,一切都应该适合您。