38

一个刚接触 OO 编程的朋友问我 Member 和 Property 的区别,我很惭愧地承认我不能给他一个好的答案。由于属性本身也可以是对象,因此我得到了一般描述和例外列表。

有人可以对何时考虑成员与财产的情况做出一个很好的定义吗?也许我在混淆这个概念,或者只是成员只是我使用的内部名称,而属性是暴露给其他对象的东西?

我不认为不知道这个问题的答案影响了我的编程质量,这只是一个语义点,但仍然困扰着我无法向他解释。

4

9 回答 9

67

属性是一种成员。其他可能是构造函数、方法、字段、嵌套类型、转换、索引器等 - 当然取决于语言/平台。很多时候,术语的确切含义取决于上下文。

要给出C# 特定的定义,请参见 C# 3.0 规范,第 1.6.1 节:

下表概述了一个类可以包含的成员类型。
(用于...的行)

  • 常数
  • 字段
  • 方法
  • 特性
  • 索引器
  • 活动
  • 运营商
  • 构造函数
  • 析构函数
  • 类型

请注意,这是一个的成员。不同的“事物”有不同种类的成员——例如,在 C# 中,接口不能将字段作为成员。

于 2009-08-05T18:45:01.947 回答
9

这两个术语在面向对象编程或面向对象设计中都没有任何定义的含义。它们在绝大多数编程语言中也没有任何明确的含义。

只有极少数的编程语言有一个叫做属性成员的概念,更少有这两者。

具有两者之一的语言的一些示例是 C++(具有成员)、ECMAScript(具有属性)和 C#(具有两者)。但是,这些术语不一定表示不同编程语言中的相同概念。例如,术语“成员”在 C++ 和 C# 中的含义大致相同,但术语“属性”在 ECMAScript 和 C# 中的含义完全不同。事实上,ECMAScript 中的术语“属性”与 C++ 和 C# 中的术语“成员”表示大致相同的概念(即,意思大致相同)。

所有这一切只是说这两个术语的含义与编程语言的相关规范所说的完全相同,不多也不少。(在此处插入无偿的 Lewis Carroll 引言。)

于 2009-08-07T21:24:22.783 回答
5

属性是一种成员。

例如,在 C# 中,一个类可以具有以下成员:

  • 构造函数
  • 析构函数
  • 常数
  • 字段
  • 方法
  • 特性
  • 索引器
  • 运营商
  • 活动
  • 代表们
  • 课程
  • 接口
  • 结构

MSDN:C#:类

于 2009-08-05T19:29:55.367 回答
1

成员只是属于一个类的对象或原始类型。

属性给你比成员更多的权力。这就像创建 getter 和 setter 的简化方法,让您可以创建公共 getter 和私有 setter;并以读取或写入的方式放置您想要的任何逻辑。它们可以用作暴露成员的一种方式,以后可以更轻松地更改读写策略。

这适用于 C#。不确定这是否适用于其他语言。

于 2009-08-05T18:45:54.050 回答
1

成员(变量)只是对象的一部分。属性是(我将用“通常”来限定它——我不确定它是一个技术上清晰的词,在多种语言中具有明确的含义)是对象的可公开访问的方面,例如通过 getter 和 setter 方法。

因此,虽然(几乎总是)一个属性是一个可访问的成员变量,但您可以拥有一个不属于对象状态的属性(并不是说这是一个好的设计):

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

  public void setJunk(String ignore){;}
  }
}
于 2009-08-05T18:46:27.747 回答
1

属性是公开字段的一种方式,其中字段是实际变量。例如(C#):

class Foo {
  private int field;
  public int Property {
    get { return field; }
    set { field = value; }
  }
}
于 2009-08-05T18:46:36.967 回答
1

属性和方法都是对象的成员。当方法访问或使用拥有的对象时,属性描述了对象的某些方面。
伪代码示例:

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

球被定义并赋予颜色(属性),而反弹方法是一个子程序,描述了球在击中另一个物体时将如何反应。
并非所有语言都有属性,即 Java 仅具有必须由 getter 和 setter 访问的字段。

于 2009-08-05T19:06:59.670 回答
0

来自PHP 手册

类成员变量称为“属性”。您可能还会看到使用其他术语(例如“属性”或“字段”)来引用它们。它们是通过使用关键字 public、protected 或 private 之一定义的,后跟一个普通的变量声明。该声明可能包括初始化。

于 2013-08-08T11:34:53.337 回答
0

成员是一个通用术语(可能起源于C++,但也定义在Java中),用于表示类的组件。属性是一个广泛的概念,用于表示类的特定特征,一旦类被实例化,将有助于定义对象的状态。

以下段落摘自Grady Booch的“面向对象的分析与设计”,有助于阐明该主题。首先,了解状态和行为的概念很重要:

对象的状态包括对象的所有(通常是静态的)属性加上每个属性的当前(通常是动态的)值。属性是指对象的属性和与其他对象的关系的总和。

行为 是对象的行为和反应,就其状态变化和消息传递(方法)而言;物体的外在可见和可测试的活动。

因此,对象的行为取决于可用的操作及其状态(属性及其当前值)。请注意,对于某些命名法,OOP 非常通用,因为它因语言而异:

术语字段 (Object Pascal)、实例变量 (Smalltalk)、成员对象 (C++) 和插槽 (CLOS) 是可互换的,表示对象部分状态的存储库。它们共同构成了对象的结构。

对对象的操作,定义为类声明的一部分。术语消息(Smalltalk)、方法(许多 OO 语言)、成员函数 (C++) 和操作通常可以互换。

但作者介绍的符号是准确的:

属性表示聚合对象的一部分,因此在分析和设计期间用于表示类的单一属性。使用与语言无关的语法,一个属性可以有一个名称、一个类,或两者兼有,还可以有一个默认表达式:A:C=E.

操作表示类提供的某些服务。操作 (...) 通过附加括号或提供操作的完整签名(由返回类、名称和正式参数(如果有))与属性区分开来:R N(Arguments)

总之,您可以将成员视为构成类的所有内容,将属性视为共同定义类结构的成员(属性),以及它与其他类的关系。当类被实例化时,值被分配给它的属性以定义对象的状态。

干杯

于 2016-06-16T01:31:03.683 回答