OOP术语:类,属性,属性,字段,数据成员

时间:2013-05-25 15:51:14

标签: class oop attributes

我开始学习OOP,我想学习什么是课程。我对一些核心元素的使用有多松散感到困惑,从而增加了我的困惑。

我看过C ++类,java类,我想知道写自己的伪类来帮助我理解。

例如在this article中我读了这个(..类属性(或类属性,字段或数据成员)

我已经看到相当清楚的问题,表明类属性和类字段之间存在差异,例如What is the difference between a Field and a Property in C#?

根据我正在研究的语言,是

的定义
  • 属性
  • 字段
  • 类变量
  • 属性

不同语言?

7 个答案:

答案 0 :(得分:25)

“字段”,“类变量”和“属性”或多或少相同 - 附加到对象的低级存储槽。每种语言的文档可能会使用不同的术语,但大多数实际的程序员可以互换使用它们。 (但是,这也意味着一些术语可能含糊不清,比如“类变量” - 可以解释为“给定类的实例的变量”,或者“语言对象本身的变量”在一种语言中类对象是你可以直接操作的东西。)

“属性”在我使用的大多数语言中都是完全不同的东西 - 它们是一种将自定义行为附加到读/写字段的方法。 (或者替换它。)

所以在Java中,规范的例子是:

class Circle {

    // The radius field
    private double radius;
    public Circle(double radius) {
        this.radius = radius;
    }

    // The radius property
    public double getRadius() {
        return radius;
    }
    public double setRadius(double radius) {
        // We're doing something else besides setting the field value in the 
        // property setter
        System.out.println("Setting radius to "+radius);
        this.radius = radius;
    }

    // The circumference property, which is read-only
    public double getCircumference() {
        // We're not even reading a field here.
        return 2 * Math.PI * radius;
    }

}

(注意,在Java中,属性foo是一对名为getFoo()setFoo()的访问器方法 - 如果属性是只读的,则只是getter。)


另一种看待这种情况的方式是“属性”是抽象 - 对象的承诺,允许调用者获取或设置一段数据。虽然“字段”等是此抽象的一种可能的实现。上例中getRadius()getCircumference()的值可以直接存储,也可以计算,对调用者来说无关紧要;制定者可能会或可能不会产生副作用;对来电者来说没关系。

答案 1 :(得分:6)

我同意你的观点,由于许多OO术语的定义松散且使用不一致,因此存在许多不必要的混淆。您询问的术语在某种程度上可以互换使用,但可以说有些术语比其他术语更常见(降序):属性 - >属性 - >类变量 - >字段。

Grady Booch “面向对象的分析和设计”中提取的以下段落有助于澄清主题。首先,理解国家的概念很重要:

  

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

OOP在某些命名方面非常通用,因为它因语言而异:

  

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

但作者引入的符号是准确的:

  

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

     

类变量: 的部分状态。总的来说,类的类变量构成了它的结构。 类变量由同一个类的所有实例共享。在C ++中,类变量被声明为静态成员。

总结:

  • 属性广义概念,用于表示类的特定特征,包含其属性及其与其他类的关系。

  • 属性 表示聚合对象的一部分,因此在分析和设计中用于表示类的单一属性。

  • 类变量是在一个类中定义的属性,其中存在单个副本,无论该类存在多少个实例。因此,该类的所有实例都共享其价值及其声明。

  • 字段实例变量的特定于语言的术语,即一个特定于每个对象的属性

答案 2 :(得分:2)

我已经做了超过20年的oop,我发现人们经常使用不同的词来做同样的事情。我的理解是字段,类变量和属性都意味着相同的事情。但是,您在问题中包含的the stackoverflow link最能说明属性。

答案 3 :(得分:1)

一般来说,字段,方法,静态方法,属性,属性和类(或静态变量)不会在语言基础上发生变化......虽然语法可能会在每种语言的基础上发生变化,但它们的功能会有所不同你会期望跨语言(期望像字段/数据成员这样的术语可以跨语言互换使用)

在C#....

字段是为给定的类实例存在的变量。

例如

public class BaseClass
{
    // This is a field that might be different in each instance of a class
    private int _field; 

    // This is a property that accesses a field
    protected int GetField
    {
        get
        {
            return _field;
        }
    }
}

字段具有“可见性”,这决定了其他类可以看到该字段的内容,因此在上面的示例中,私有字段只能由包含它的类使用,但属性访问器通过子类提供对字段的只读访问权限

一个属性可以让你获得(有时称为访问器)或设置(有时称为mutator)字段的值...属性允许你做一些事情,防止写一个字段,例如来自课外,改变该领域的可见性(例如私人/受保护/公共)。 mutator允许您在设置字段值

之前提供一些自定义逻辑

因此,属性更像是获取/设置字段值但提供更多功能的方法

例如

public class BaseClass
{
    // This is a field that might be different in each instance of a class
    private int _field; 

    // This is a property that accesses a field, but since it's visibility 
    // is protected only subclasses will know about this property 
    // (and through it the field) - The field and property in this case
    // will be hidden from other classes.
    protected int GetField
    {
        // This is an accessor
        get
        {
            return _field;
        }
        // This is a mutator
        set
        {
            // This can perform some more logic
            if (_field != value) 
            {
                 Console.WriteLine("The value of _field changed");
                 _field = value;
                 OnChanged; // Call some imaginary OnChange method
            } else {
                 Console.WriteLine("The value of _field was not changed");
            }
        }
    }
}

类或静态变量是一个对于类的所有实例都相同的变量。 因此,例如,如果您想要一个类的描述,那么该类的所有实例的描述都是相同的,并且可以通过使用该类来访问 例如

public class BaseClass
{
    // A static (or class variable) can be accessed from anywhere by writing
    // BaseClass.DESCRIPTION
    public static string DESCRIPTION = "BaseClass";
}

public class TestClass
{
    public void Test()
    {
        string BaseClassDescription = BaseClass.DESCRIPTION;
    }
}

使用与属性相关的术语时要小心。在C#中,它是一个可以通过“装饰”类或方法应用于其他类或方法的类,在其他上下文中它可以简单地引用类包含的字段。

// The functionality of this attribute will be documented somewhere
[Test]
public class TestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}

有些语言没有像C#那样的“属性”(见上文)

希望一切都有意义......不要让你超负荷!

答案 4 :(得分:1)

首先,您需要选择一种语言。例如,我建议您选择Ruby语言和社区。在选择一种语言之前,你不能避免混淆,因为不同的社区对同一事物使用不同的术语。

例如,在Ruby中称为Module,Java称为抽象类。在某些语言中称为 attributes ,在Ruby中称为instance variables。我推荐Ruby特别是它的逻辑和精心设计的OOP系统。

将以下内容写入* .rb文件或 irb (交互式Ruby解释器)中的命令行:

class Dog                         # <-- Here you define a class representing all dogs.
  def breathe                     # <-- Here you teach your class a method: #breathe
    puts "I'm breathing."
  end

  def speak                       # <-- Here you teach your class another method: #speak
    puts "Bow wow!"
  end
end

现在你有了一个类,你可以创建它的实例

Seamus = Dog.new

您刚刚创建了一个实例,类Dog的特定狗,并将其存储在常量Seamus中。现在你可以玩它了:

Seamus.breathe                   # <-- Invoking #breathe instance method of Seamus
#=> I'm breathing.
Seamus.speak                     # <-- Invoking #speak instance method of Seamus
#=> Bow wow!

至于你剩下的术语问题,“属性”或“属性”在Ruby中被理解为“变量”,几乎总是实例变量。至于术语“数据成员”,只要忘掉它。术语“字段”并不是真的用在Ruby中,Ruby中的“类变量”意味着很少使用的东西,你现在肯定不需要知道。

因此,为了保持世界的美好并向您展示OOP在Ruby中非常简单和轻松,让我们创建一个属性,或者在Ruby术语中,创建一个Dog类的实例变量。众所周知,每只狗都有一些重量,不同的狗可能有不同的重量。因此,在创建新狗时,我们将要求用户告诉我们狗的体重:

class Dog
  def initialize( weight )  # <-- Defining initialization method with one argument 'weight'
    @weight = weight        # <-- Setting the dog's attribute (instance variable)
  end
  attr_reader :weight       # <-- Making the dog's weight attribute visible to the world.
end

Drooly = Dog.new( 16 )      # <-- Weight now must provide weight upon initialization.
Drooly.weight               # <-- Now we can ask Drooly about his weight.
#=> 16

请记住,使用Ruby(或Python),事情很简单。

答案 5 :(得分:1)

我在my question中发现.Net中定义的属性只是代码的一种方便语法,它们根本不依赖于底层变量(当然,除了自动实现的属性)。所以,说“类属性和类字段之间有什么区别”就像是说:方法和属性之间有什么区别。没有区别,一个是代码,另一个是数据。并且,他们不需要彼此有任何关系。

同样的词,如“属性”和“属性”,在不同的语言和意识形态中被重复使用,具有截然不同的含义,实在太糟糕了。也许有人需要定义一个面向对象的语言来讨论OOP中的概念? UML?

答案 6 :(得分:0)

在课堂上

public class ClassSample
{
    private int ClassAttribute;

    public int Property
    {
        get { return ClassAttribute; }
        set { ClassAttribute = value; }
    }
}

在程序中

    class Program
    {
        static void Main(string[] args)
        {
            var objectSample = new ClassSample();
            //Get Object Property
            var GetProperty = objectSample.Property;
        }
    }