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#中的不同稱呼:
OOA/OOD中的方法(Method)是指對象的操作(Operation)。在C++中稱為Member Function(成員函數),而在C#中還是叫做Method。在表中加入對方法(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。
在我們平日里使用術語的時候,一定要准確,否則在交流時遇到不必要的障礙
|