【问题标题】:what is a member vs. a property什么是成员与属性
【发布时间】:2010-11-17 03:02:54
【问题描述】:

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

有人可以对何时将某物视为成员与属性做出一个很好的定义吗?也许我是在混淆这个概念,或者只是成员只是我使用的内部名称,而属性是暴露给其他对象的内容?

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

【问题讨论】:

  • 我认为您正在寻找的术语,而不是成员,是 field。否则:成员变量.
  • 对谷歌来说也是一个特别难的定义
  • 这是一个有趣的问题。您会认为成员会暗示财产所没有的自治权(例如,您拥有财产,但您不拥有成员)

标签: oop properties member


【解决方案1】:

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

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

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

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

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

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

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

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

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

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

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

干杯

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你的“会员”其实是一个“字段”。
    【解决方案3】:

    来自PHP manual

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

        属性是一种成员。

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

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

        MSDN: C#: class

        【讨论】:

          【解决方案6】:

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

          从 C# 3.0 规范的第 1.6.1 节中给出 C# 特定的定义

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

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

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

          【讨论】:

          • +1 是迄今为止(四个中)唯一知道属性也是成员的人...
          【解决方案7】:

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

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

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

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

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

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

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

              【讨论】:

                猜你喜欢
                • 2010-10-08
                • 2011-08-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-05-14
                • 2017-04-02
                • 2015-04-23
                • 2023-03-12
                相关资源
                最近更新 更多