是attribute,还是property?有时是个麻烦。
attribute和property都可以翻译成“属性”,有的地方用attribute表示“属性”,有的地方又在用property,初学者常常在这两个单词间“迷失”,甚至认为二者没有区别,是一样的。可是attribute不等于property。二者之间到底有何区别?
我们从ooa/ood(object oriented analysis / object oriented design,面向对象分析与设计)说起。在ooa/ood中的使用attribute表示属性,指对象(object)的特征(feature)。我们在一些编程语言(如c#、delhpi等)中遇到的“属性”一词,为何是property,而不是attribute呢?
为了理解这一点,我们把c++拽进来看看。ooa/ood中的attribute在c++中称为member variable(成员变量),慢慢开始明白了吧。c++中的member variable在c#中可以继续延用,但有了一个新的称呼:field(字段)。看一个简单的c#示例:
public class student { // student类
private string name; // c#中称为field(字段),c++中称为member variable(成员变量),ooa/ood中称为attribute(属性)
}
我们整理出下表,可以看到同样的概念在ooa/ood、c++和c#中的不同称呼:
description
|
ooa/ood
|
c++
|
.net(c#) /delphi
|
feature
|
attribute
|
member variable
|
field
|
ooa/ood中的方法(method)是指对象的操作(operation)。在c++中称为member function(成员函数),而在c#中还是叫做method。在表中加入对方法(method)的称呼:
description
|
ooa/ood
|
c++
|
.net(c#) /delphi
|
feature
|
attribute
|
member variable
|
field
|
operation
|
method
|
member function
|
method
|
也可以看出,c++中将attribute称为member variable,将method称为member function,其实还是很贴切的。从本质上说,确实是在声明变量、定义函数。后来者(c#等)可能觉得这样的称呼不够oo(object oriented,面向对象),于是做了些改变。method延用ooa/ood的称呼不用说,但将attribute称作field,总觉得欠妥。因为db(database,数据库)中有field的概念,也译作“字段”,实在是容易混淆。
现在我们可以把ooa/ood中提到的属性(attribute)同c#中提到的属性(property)区分开来。继续上面的示例:
public class student { // student类
private string name; // c#中称为field(字段),c++中称为member variable(成员变量),ooa/ood中称为attribute(属性)
public string name { // c#中称为property(属性)
get {
return name;
}
set {
name = value;
}
}
}
我们顺便看看private和public:property本质上是一对get/set方法,可以进行访问控制,因而可以设置为public;而按照ooa/ood原则,attribute不能设为public,而要设为private。
c#中确实也有attribute,把它译作“特性”似乎更好些。如:
[webmethod]
在不少的.net/c#书籍中看到有把attribute译成“属性”的,这样一来,老鸟倒是可以通过语境判断出来不是在说property,初学者恐怕一下子就跌进云里雾里了。虽然不至于“一个馒头引发的血案”,但“两个属性引发的歧异”,终究不是什么好事情。
另外,在web编程中也常见到attribute和property混用的情况。比如用vs 2003或2005创建一个asp.net应用程序,如果在代码视图添加控件:
<asp:textbox id=”txtname” text=”hello” runat=”server” />
此时textbox控件中的id、text和runat都称为attribute,这是延用了html中对属性(attribute)的称呼。
如果是在设计视图中拖放控件,然后在属性(properties)窗口中设置id或text,此时又会将id或text称为property。因为控件在服务器上是作为控件类(control class)实现,使得可以用编程的方式来访问控件。那么属性必然是class中的property。
当我们在学习新知识的时候,除了“知其然”,更要“知其所以然”,这样我们才能对概念有深层次的理解。同时,在我们平日里使用术语的时候,一定要准确,否则在交流时遇到不必要的障碍,白白增加交流成本。