您的位置:首页 > 运维架构

property和attribute的区别

2012-03-16 21:38 393 查看
property是指类向外提供的数据区域。
而attribute则是描述对象在编译时或运行时属性的,分为固有型和用户自定义型,其中用户自定义型可以利用Reflection在运行期获取。
这两者是有本质区别的。

资料上说二者一个是service的属性,而另一个是interface的。

第一种好象更准确,摘要如下:

在很多人的脑海中,Attribute就是类的属性,Property呢?好像也是类的属性?因此有很多人不加区别的统一称为类的属性,尤其是在写中文文章的时候。这种心理是典型的鸵鸟心态,眼不见为净。其实稍微用脚想一下就知道,事实肯定不是这样的,UML中既然发明了这两个术语,显然不是用来冗余的。它们之间肯定有着千丝万缕的联系与区别。

各种各样的面向对象语言、各种组件技术、模板技术、Web Service技术,其中大部分涉及到了“属性”这个概念,而其英文术语则常常是Attribute、Property或者Field。很多人一概称之为“属性”,有的地方确实可以不加区分,但有的地方却是差之毫厘、谬以千里。我对于这些纷纷扰扰的技术和术语也很苦恼,但是我们至少可以通过UML中的这两个术语的解释找到一个可以参考的标准。无论如何,UML是面向对象技术的集大成者和事实上的标准。

很客观的说,UML1.4中对于这两个术语并没有很清晰的定义,但是其区别还是显而易见的。Attribute应该是UML1.4中的宠儿,而Property连一个单独的术语都没有捞到。谁也没想到在UML2.0中风云突变,Attribute从类图中消失了,而Property堂而皇之入主中原。

1。4中 Attribute是与Classifier相关联的术语,它比Property的影响范围要小。Class是Classifier的子类,因此Attribute也可以表示Class的属性。从上面的定义还可以看出,Attribute可以是Classifier的实例的命名的槽。对于Class来说,其实例就是Object,Object的槽就是对象的属性值槽。因此,Attribute是可以作为对象的属性的。而Property似乎没有这一层的含义。按MOF(元对象设施,OMG的另一个规范,后面会有详细解释)的模型层次划分,Attribute涉及的模型层从M2到M0,而Property似乎只是M2层的概念。

2。0中 Attribute这里仅仅指一个类元的结构特征,可以将类元的实例联系到一个或者一组具体值。而没有提到实例的槽(slot)等等。我猜想,这是因为UML2.0中已经把Attribute作为Property的一个子集了,所以关于实例的槽(slot)等等的具体赋值方法,都归结到Property的定义中解释了。

另外一点值得注意的是,Attribute的定义来自于术语表,而没有在元模型图中出现。而Property出现在元模型图中,并且都做了详细而具体的解释。这一点可以看出,UML强化Property,弱化Attribute的决心。

Attribute和Property的总结

这一节对Attribute和Property作一个小结,基于目前最新的UML2.0规范:

l 总体上来说,Attribute是Property的子集,Property会在适当的时机表现为Attribute;

l Property出现在类图的元模型中,代表了Class的所有结构化特征;Attribute没有出现在元模型中,它仅仅在Class的概念中存在,没有相应的语法了;

l Property有详细的定义和约束,而Attribute没有详细的定义,因此也不能用OCL写出其约束。

l Property和Attribute都是M2层的概念。在M1层,它们的实例是具体类的属性;在M0层,它们的实例的实例是具体对象的槽中存储的值。

对于property和attribute这两个名词都叫“属性”的问题,来源于国内it书籍翻译界的疏忽。

其实它们来源于两个不同的领域,attribute属于OOA/OOD的概念,而property属于编程语言中的概念。下面我们来说明它们的异同。
Attribute
Attributes是Microsoft .NET Framework文件的元数据,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
Property
属性是面向对象编程的基本概念,提供了对私有字段的访问封装,在C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。关于属性的概念,不是本文的重点,而且相信大部分的技术人员应该对属性有清晰的概念。以下是简单的属性
区别
可以说两者没有可比性,只不过我们国家的语言特点才引起的歧异,其实只要记住Attribute是派生于System,Attribute类之下,它的主要作用是描述,比如某为了描述某个方法是来自与外部的dll,
可以写如下代码,这就是一个Attribute,他是一个描述(或者说声明)
[DllImport("User32.dll")]

Attribute也有很多系统的“默认”属性,见下表
[align=left]预定义的属性[/align]
[align=left]有效目标[/align]
[align=left]说明[/align]
[align=left]AttributeUsage[/align]
[align=left]Class[/align]
[align=left]指定另一个属性类的有效使用方式[/align]
[align=left]CLSCompliant[/align]
[align=left]全部[/align]
[align=left]指出程序元素是否与CLS兼容[/align]
[align=left]Conditional[/align]
[align=left]Method[/align]
[align=left]指出如果没有定义相关联的字符串,编译器就可以忽略对这个方法的任何调用[/align]
[align=left]DllImport[/align]
[align=left]Method[/align]
[align=left]指定包含外部方法的实现的DLL位置[/align]
[align=left]STAThread[/align]
[align=left]Method(Main)[/align]
[align=left]指出程序的默认线程模型为STA[/align]
[align=left]MTAThread[/align]
[align=left]Method(Main)[/align]
[align=left]指出程序的默认模型为多线程(MTA)[/align]
[align=left]Obsolete[/align]
[align=left]除了Assembly、Module、Parameter和Return[/align]
[align=left]将一个元素标示为不可用,通知用户此元素将被从未来的产品[/align]
[align=left]ParamArray[/align]
[align=left]Parameter[/align]
[align=left]允许单个参数被隐式地当作params(数组)参数对待[/align]
[align=left]Serializable[/align]
[align=left]Class、Struct、enum、delegate[/align]
[align=left]指定这种类型的所有公共和私有字段可以被串行化[/align]
[align=left]NonSerialized[/align]
[align=left]Field[/align]
[align=left]应用于被标示为可串行化的类的字段,指出这些字段将不可被串行化[/align]
[align=left]StructLayout[/align]
[align=left]Class、struct[/align]
[align=left]指定类或结构的数据布局的性质,比如Auto、Explicit或sequential[/align]
[align=left]ThreadStatic[/align]
[align=left]Field(静态)[/align]
[align=left]实现线程局部存储(TLS)。不能跨多个线程共享给定的静态字段,每个线程拥有这个静态字段的副本[/align]
而Property是指编程过程中的字段,也即类的成员。
如:
private int hour; //定义私有变量表示"小时",外部是访问不到的.}
public int Hour// 定义Hour程序接口
{
set { hour=value; }
get { return hour;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: