2009-08-05 77 views
25

一位剛剛接觸面向對象程序設計的朋友問我會員與財產的區別,我很慚愧地承認我無法給他一個好的答案。由於屬性本身也可以是對象,因此我只剩下一般描述和例外列表。什麼是會員與財產

請問有人可以提出一個關於什麼時候考慮一​​個成員與一個財產的好定義嗎?也許我混淆了這個概念,還是僅僅是一個成員就是我使用的內部名稱,而這個屬性就是暴露給其他對象的東西?

我不認爲不知道這個問題的答案已經影響了我的編程的質量,這只是一個語義問題,但它仍然困擾我,我無法向他解釋。

+0

我認爲您尋找的術語而不是成員是* field *。或以其他方式:member * variable *。 – Thorarin 2009-08-05 19:28:19

+0

Google的定義非常難以定義, – ThorSummoner 2014-10-28 05:43:46

+0

也是一個有趣的問題。你會認爲一個成員會暗示一個財產沒有的自主權(例如你擁有財產,但你不擁有成員) – josh 2016-07-07 15:20:53

回答

46

屬性是一個種類的成員。其他可能是構造函數,方法,字段,嵌套類型,轉換,索引等 - 當然取決於語言/平臺。很多時候,術語的含義取決於上下文。

爲了給出C#特異性定義,從C#3.0規範,第1.6.1節:

下表提供了種成員類可以包含的的概述。
(行的......)

  • 常量
  • 方法
  • 屬性
  • 索引器
  • 活動
  • 運營商
  • 構造
  • 分析構函數
  • 類型

請注意,這是一個類的成員。不同的「事物」有不同類型的成員 - 例如,在C#中,接口不能有一個字段作爲成員。

+1

+1是迄今爲止唯一一個(四分之一)知道一個財產也是成員... – Guffa 2009-08-05 19:06:13

1

成員只是屬於一個類的對象或原始類型。

房產給你比會員更多的權力。這就像一個簡化的方法來創建讓你獲得的getter和setter,比如public getter和private setter;並將其所需的任何邏輯放在將被讀取或寫入的方式中。它們可以用作揭示成員的一種方式,以後可以更容易地改變閱讀和寫作政策。

這適用於C#。不知道這是否適用於其他語言。

1

成員(變量)只是對象的一部分。屬性是(我會用「通常」來限定這一點 - 我不確定它是否是一個在多種語言中具有明確含義的技術上明確的詞)是該對象的公共可訪問的方面,例如,通過getter和setter方法。

因此,雖然(幾乎總是)一個屬性是reacheable成員變量,你可以擁有這不是真正的對象狀態(不,這是很好的設計)的一部分的屬性:

public class Foo { 
    public String getJunk() 
    { return "Junk";} 

    public void setJunk(String ignore){;} 
    } 
} 
1

屬性是一個暴露字段的方式,其中字段是實際變量。例如(C#):

class Foo { 
    private int field; 
    public int Property { 
    get { return field; } 
    set { field = value; } 
    } 
}
+0

你的「成員」實際上是一個「領域」。 – bradlis7 2015-08-19 18:12:47

1

這兩個屬性和方法都是對象的成員。屬性描述對象的某些方面,而方法訪問或使用擁有對象。
在僞代碼的一個例子:

Object Ball 
Property color(some Value) 
Method bounce(subroutine describing the movement of the Ball) 

當球被定義和給出的顏色(屬性),而方法彈跳是描述該球將如何在擊中另一個目的反應的子程序。
並非所有語言都有屬性,即Java只有必須由getter和setter訪問的字段。

4

屬性是一種成員。

在C#,例如,一類可以有以下成員:

  • 構造
  • 析構函數
  • 常量
  • 字段
  • 方法
  • 屬性
  • 索引器
  • 運營商
  • 活動
  • 代表
  • 接口
  • 的Structs

MSDN: C#: class

5

兩個術語都不具有任何定義的任何意義的面向對象編程或對象面向設計。它們在絕大多數編程語言中也沒有任何定義的含義。

只有編程語言的一個非常小的數目有一個叫財產成員概念,甚至更少的兼得。

一些具有兩者之一的語言的例子是C++(具有成員),ECMAScript(具有屬性)和C#(具有兩者)。但是,這些術語不一定表示不同編程語言中的相同概念。例如,術語「成員」在C++和C#中的含義大致相同,但術語「屬性」在ECMAScript和C#中意味着完全不同的東西。實際上,ECMAScript中的術語「屬性」與C++和C#中的術語「成員」表示的概念大致相同(即意味着大致相同的事物)。

所有這些只是說這兩個術語的意思正是編程語言的相關規範所說的意思,不多也不少。 (插入無償劉易斯·卡羅爾在這裏引用。)

0

PHP manual

類成員變量被稱爲 「屬性」。您也可以使用其他術語(如「屬性」或「字段」)查看它們。它們是通過使用關鍵字public,protected或private之一來定義的,後面跟着一個正常的變量聲明。該聲明可能包括初始化。

0

成員是一個通用術語(可能起源於C++,但也在Java中定義)用於表示類的組成部分。屬性是一個寬泛的概念,用於表示一個類的特定特徵,一旦這個類被實例化,它將幫助定義該對象的狀態。

下面的段落,從提取的「面向對象分析與設計」,由格雷迪Booch的有助於澄清問題。

對象狀態包括所有物體的(通常是靜態)特性加的每一個的電流(通常是動態的)值的:首先,它以瞭解狀態和行爲的概念是重要的這些屬性。通過屬性,我們指的是對象屬性的總和以及與其他對象的關係。

行爲是如何一個對象行爲和反應,在其狀態的變化和消息傳遞(方法)條款;一個物體的外觀和可測試的活動。

因此,對象的行爲取決於可用的操作及其狀態(屬性及其當前值)。需要注意的是OOP是相當通用的關於某些術語,因爲它廣泛變化從語言到語言:

術語字段(Object Pascal中),實例變量(Smalltalk中),成員對象(C++),和槽(CLOS )是可互換的,這意味着對象狀態的一部分的存儲庫。它們共同構成了對象的結構。

對象的操作,定義爲類的聲明的一部分。 術語消息(Smalltalk),方法(許多OO語言),成員函數(C++)和操作通常是可以互換的。

但是由作者引入的符號是精確:

一種屬性表示聚合對象的一部分,因此是分析過程中使用以及設計以表達單數類的屬性。使用與語言無關的語法,屬性可以具有名稱,類或兩者,並且可以有一個默認表達式:A:C=E

操作表示該類提供的一些服務。操作(...)從屬性通過附加括號或提供操作的完整簽名區分,回報類,名稱和正式參數組成的(如果有的話):R N(Arguments)

總之,你能想到的作爲構成類的所有成員,作爲成員(屬性)的屬性共同定義類的結構,以及與其他類的關係。當類被實例化時,值被分配給它的屬性以便定義對象的狀態。

乾杯