`
seya
  • 浏览: 361977 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

对flex中的[InstanceType]的困惑

阅读更多
最近因为工作上的需要,在学习flex.看了creating and extending flex2 components文档,网页链接如下:http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=metadata_141_01.html#161936
有兴趣的可以一起研究下哈。
在学习到MetaData的时候,对其中的[InstanceType]这个不是很理解。按照文档中的解释,它是用来限定组建类型的。应用于创建模板的场景。请看如下代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="init();">
	<mx:Script>
		<![CDATA[
			import mx.validators.ValidationResult;
			import mx.core.UIComponent;
			import mx.containers.HBox;
			import mx.controls.CheckBox;
			
			[InstanceType("mx.controls.Button")]
			public var topRow:IDeferredInstance;
			
			[InstanceType("mx.controls.Button")]
			[ArrayElementType("mx.core.IDeferredInstance")]
			public var bottomRow:Array;
			
			private function init():void{
				addChild(UIComponent(topRow.getInstance()));
				
				var controlbox:HBox = new HBox();
				for(var i:int = 0;i<bottomRow.length;i++){
					controlbox.addChild(UIComponent(bottomRow[i].getInstance()));
				}
				addChild(controlbox);
			}
		]]>
	</mx:Script>
</mx:VBox>

在上面的代码中,使用了:(1)[InstanceType("mx.controls.Button")]
public var topRow:IDeferredInstance;
我们写了一个TemplateTest.mxml
对这个MyTemplateComponentDeferredSpecific.mxml进行使用的时候:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:MM = "components.*">
	<mx:Panel paddingTop="10" paddingBottom="10" 
        paddingRight="10" paddingLeft="10">
	<MM:MyTemplateComponentDeferred >
		<MM:topRow>
			<mx:Label text="button" />	 
		</MM:topRow>
		<MM:bottomRow>
			<mx:Button id="save" label="save1"/>
			<mx:Button id="btn2" label="cancel"/>
			<mx:Button id="btn3" label="back"/>		
		</MM:bottomRow>
	</MM:MyTemplateComponentDeferred>
	</mx:Panel>
</mx:Application>

与以上(1)处代码对应的是<MM:topRow>
<mx:Label text="button" />
</MM:topRow>
MetaData的作用就是告诉编译器如何去解析识别代码,所以在编译的时候,就对topRow里面的组建类型进行检验,由于这里是Label类型,而如(1)处代码所示,模板中限定了只能为Button类型,不匹配,便出现了error提示:In initializer for 'topRow': type mx.controls.Label is not assignable to target type mx.controls.Button
然后将它改称<mx:Button label="button">编译通用,没问题了。
但是,怀着好奇心,又试了一下,将它改成了<mx:CheckBox label="box">,问题出现了,居然没有报错。
遂又试了几个,将[InstanceType("mx.controls.Button")]改称[InstanceType("mx.controls.CheckBox")],也没问题。然后将<MM:topRow>
               <mx:Label text="button" />                        </MM:topRow>
改成<MM:topRow>
<mx:Button label="button" />
</MM:topRow>
出现warning:[InstanceType](mx.controls:CheckBox): type mx.controls:CheckBox is unavailable.
但是运行还是可以的,生成Button组建。
难道是组建之间存在什么兼容性?望高人指点。



分享到:
评论
2 楼 achuanle 2009-07-24  
谢谢你,看了你的代码让我更明白了InstanceType的用法
1 楼 achuanle 2009-07-24  
因为CheckBox继承了Button

相关推荐

    在C#DropDownCombo中使用AWS InstanceType属性

    本文将深入探讨如何在C# DropDownCombo控件中利用AWS SDK来展示和使用`InstanceType`属性,以便用户可以方便地选择不同类型的AWS EC2实例。 首先,AWS SDK为.NET开发者提供了丰富的类库,使得与AWS服务的交互变得...

    iOS单利用法举例

    1. 封锁初始化:使类的实例化过程只能在特定的代码块中进行,通常是`+ (instancetype)sharedInstance`方法。 2. 添加静态实例变量:用来保存类的唯一实例。 3. 添加私有初始化方法:防止外部直接通过`init`方法创建...

    C#写的反射器,模拟反射机制

    这涉及到对Assembly和Module类的使用,因为类型存在于特定的程序集和模块中。 ```csharp public Type GetTypeFromName(string typeName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); ...

    iOS单例传值

    在iOS开发中,单例(Singleton)是一种设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,或者需要共享数据的情况下非常有用。在iOS应用中,特别是当你想要在多个视图...

    objective-c单例模式的完整书写方式

    Objective-C中的单例模式是一种设计模式,用于在整个应用程序中确保只有一个特定类的实例存在,并提供一...在实际开发中,可以根据需求对单例进行扩展,添加额外的功能或属性,但始终要保持单例的唯一性和全局访问性。

    单例的代码

    1. 违反开闭原则:对扩展开放,对修改关闭。单例模式限制了类的实例化,增加了代码的耦合度。 2. 测试困难:由于全局只有一个实例,单元测试时难以模拟不同的环境。 3. 可能导致滥用:如果过度使用,可能会造成系统...

    单例模式

    在 `TCUtil.m` 文件中,添加 `- (instancetype)init NS_UNAVAILABLE;` 来禁止直接使用 `init` 方法。 3. **单例实现**: 实现 `+ (instancetype)sharedInstance;` 方法。这里通常使用 GCD(Grand Central Dispatch...

    iphone 开发学习基础NSSet

    在iOS开发中,Objective-C是苹果官方推荐的编程语言,对于初学者来说,掌握其基本语法至关重要。NSSet作为Objective-C中的一个核心数据结构,尤其在处理无序且不重复元素的集合时,扮演着重要角色。本文将深入探讨...

    ios-ios 炒鸡简单使用地址选择器(AddressPickerView),支持省份,省市,省市区三种联动.zip

    (instancetype)provincePickerViewWithProvinceBlock:(void(^)(NSString *province))provinceBlock; /** * 显示省份和市级 * cityBlock : 回调省份和城市 */ (instancetype)cityPickerViewWithCityBlock:(void...

    IOS编程中使用多线程

    苹果公司在OS X 10.5及后续版本中,对多线程的支持进行了显著增强,引入了`NSThread`、`NSOperation`以及`NSOperationQueue`等类,使得开发者能够更加轻松地管理和控制多线程任务。 #### NSThread简介 `NSThread`...

    OC-单例OC-单例OC-单例OC-单例OC-单例

    2. **资源控制**:可以有效地控制共享资源,避免多个对象对同一资源的并发访问问题。 3. **节省内存**:如果一个对象会频繁使用,但只需要一个实例,单例可以避免频繁的内存分配。 注意事项: 1. **内存泄漏**:...

    ios字典排序

    可以通过初始化方法创建`NSOrderedDictionary`,如`+ (instancetype)dictionaryWithCapacity:(NSUInteger)capacity`,或者从键值对数组创建,如`+ (instancetype)dictionaryWithObjects:(NSArray *)objects forKeys...

    iOS 单例模式

    在Objective-C中,单例的实现通常使用`+ (instancetype)sharedInstance`方法。首先,我们需要声明一个静态变量来保存单例实例,然后在`+initialize`方法中初始化这个实例。`+initialize`是类加载时自动调用的方法,...

    细究单例那些你不知道的事(OC).zip

    为了解决这个问题,可以在Swift中对单例进行封装: ```swift class SwiftSingleton { static let sharedInstance = SingletonClass.sharedInstance } ``` 总结起来,OC中的单例模式涉及了内存管理、线程安全和...

    iOS中比较好的字典模型转化方式

    字典是一种常见的数据结构,可以方便地存储键值对,而模型对象则是面向对象编程中的实体类,用于封装业务数据。将字典转化为模型对象可以提高代码的可读性和可维护性。本文将深入探讨iOS中进行字典到模型转化的几种...

    对GCDAsyncUdpSocket的简单封装,作为发送和接受广播,一般UDP报文的接口

    在`UdpSocketController.h`中,我们可以预见到会声明一些关键的方法,例如初始化方法`- (instancetype)init`; 开始监听的方法`- (void)startListeningOnPort:(UInt16)port`; 发送数据的方法`- (void)sendData:...

    ios-把block当成属性放在全局字典中的用例.zip

    总的来说,这个示例提供了一种在iOS应用中方便地跨界面传递和执行Block的方法,减少了对代理模式的依赖,提高了代码的灵活性。然而,使用这种方式时也需要注意内存管理问题,避免不必要的内存泄漏。

    单例模式.zipIOS应用例子源码下载

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在iOS应用开发中,单例模式被广泛用于管理共享资源、配置信息或者提供全局服务。这个“单例模式.zip”文件包含的是一个适用于iOS...

    Objective-C类方法中使用self注意事项

    - 使用`+ (instancetype)alloc]`和`- (id)init]`,可以将类方法转换为实例方法,因为`alloc`实际上是一个类方法,它返回一个新分配的未初始化的实例。 - 但是,注意不要在类方法中误用`self.init`,因为这会引发...

Global site tag (gtag.js) - Google Analytics