今天想把BlogReader的C++版本写出来,当然是照着MSDN上微软的官方文档来做了,中间邂逅了下面一段代码,查了一下,是关于boxing的,现在介绍一下吧
Object^ FeedData::TitleGetter(Object^ instance)
{
auto object = (FeedData^)instance;
return PropertyValue::CreateString(object->Title);
}
先解释一下,最后一行object->Title是一个String^类型的值。TitleGetter函数返回值是一个Object^类型,参数也是一个Object^类型,所以PropertyValue::CreateString(String^ value)就应该返回一个Object^类型值,事实当然是如此,但是我们追本逐源地来看一下PropertyValue是个什么东西吧。
public ref class PropertyValue sealed : Object,
IPropertyValue
MSDN的解释是:
Represents a value in a property store 字面意思理解就是把一个值放进一个属性堆里面,也就是boxing了。我的理解是封装,跟encapsulate差不多的意思,把一个内建类型打包成一个Object^类,也就是相当于原来C++中把内建的int型转为INT类,只不过这里把int,double,boolean都转成Object^类型了。
PropertyValue类就相当于一个打包公司,有一天你高高兴兴地想把一个boolean传给你的朋友func1(Object^ value),你到了这家公司,于是开始下面的对话:
你:老板,我要给我的朋友func1寄一个boolean
老板:客官稍等,我们查到您朋友想要个Object^
你:他就像要个boolean,我知道的,他 不过想用Object^掩人耳目罢了,我到你这来,就知道你这里做打包的生意,快些给我打包
老板:客观看来您是回头客了,伙计,来,给这位爷打包!
伙计齐声道:要包什么?我们这里可以打包int32,double,string。。。
老板:boolean,CreateBoolean()跑哪里去了?快来打包!
CreateBoolean():来了,您稍等,马上打包完成。
。。。。so的一声。。。。
你:不错,是个Object^了,我朋友怎么把boolean取出来?
老板:取出来也方便,我们这边有个GetBoolean()工具,但是Dino还没研究怎么用,不过还有个方法,你可以用IReference<Boolean^> value = dynamic_cast<IReference<int^>> (boxedObj)就行了。
好嘞,再来讲讲最后这个解包吧,就是unbox
IReference是一个接口,可以允许枚举型,结构体,代理(delegate)等类型转成一个value。
generic<typename T>
public interface class IReference: IPropertyValue
它只有一个属性
public property T^ value
{
T^ get();
}
用的时候就直接赋值就行了
IReference<int^> refInt = dynamic_cast<IReferenc<int^>>(boxedObj);
返回值就是int型。
总结:给我的感觉Boxing还是相当于把一个内建类型封装一下,让其能作为Object^类型传递,因为Object^类是所有类的父类,所以可以很方便地转换成你所需要的类。如果有其他简单的打包解包方法,请大家提出来,希望有更多的朋友研究Windows 8,可以更多地交流一下。
之后可能会翻译
Nish Sivakumar 在Code Project上写的一篇关于Windows Runtime的基础知识的文章,写的挺好的,跟大家分享一下。链接在此,感兴趣的朋友可以去查看:
http://www.codeproject.com/Articles/262151/Visual-Cplusplus-and-WinRT-Metro-Some-fundamentals
posted on 2012-02-16 12:05
Dino-Tech 阅读(281)
评论(0) 编辑 收藏 引用