Answers:
您可以看一看(并引用)G。Booch所著的“面向对象的分析和设计”这本书:
...对象是具有状态,行为和身份的实体。相似对象的结构和行为在其通用类中定义。术语实例和对象可以互换。
在以下各节中,我们将更详细地考虑状态,行为和身份的概念。...
有一个完整的小节描述了状态的概念:
...从这个例子中,我们可以形成下面的底层定义。
对象的状态包含对象的所有(通常是静态)属性以及这些属性中每个属性的当前(通常是动态)值...
您还需要记住,对象的状态是“抽象”实体,由方法可观察的内容确定。例如,实现哈希表的对象的状态是哈希表中存储的值的集合,而不是所有内部表示的细节。
术语“ 状态 ”可以以各种含义使用,甚至可能不是全部都容易受到精确定义的影响。因此,在您的论文中包括一个定义非常重要,以使您清楚地使用该术语。在下面的内容中,我没有提供对象状态的唯一定义,而是尝试勾勒出许多思考它的方式,这些方式可能适用于不同的上下文。
但是,首先,您需要考虑“ 对象 ”的含义:您是否正在考虑一个概念性对象,即您要建模的某个实体,或某个特定程序中的类的实例;也许您还想考虑一个变量的状态,该变量可能在不同时间引用不同的对象或系统,可能是通过某个用户界面访问的。
在OOP中定义对象状态的部分困难在于,当我们以特定语言对实体建模时,该语言通常不允许我们将概念上属于同一实体的对象属性与不属于其他实体的对象属性区分开。例如,的链表Car
将由多个- Link
对象组成,这些对象包含指向下一个(可能是上一个)的指针,Link
尽管从概念上讲,该列表是单个对象。链接也可以嵌入Car
-对象或包含指向它们的指针,但是在这种情况下,链接的对象在概念上是分开的,而不是列表的一部分;但是,在最近的更改列表中,这些更改只能出现在列表中,并视为其中的一部分。在这些各种情况下,我们必须决定是否考虑将一个对象的状态包含在链接对象的状态中。此外,a Car
可能具有指向的链接Registering_Authority
-当汽车的注册机构更改其网站的URL时,我们可能不认为汽车的状态会发生变化。除非实现语言允许我们区分不同类型的链接,否则仅凭语言就不可能对对象的状态做出一般定义。
可以将“ 外部 ”或“ 功能 ” 状态定义为“其行为方式”,例如 它对方法调用或用户界面的反应。对于作为类实例的对象,此定义取决于该对象被视为所属的类型:被视为a Circle
,其颜色Coloured_Circle
是不可见的,因此与它的状态无关。这样做的困难在于,可能需要根据返回的值来定义“其反应方式”,而这些“值”可能是其他对象的状态。一种形式化的说法是,如果某个对象所嵌入的系统的所有将来可能执行的所有操作都导致从输入到该系统的相同映射到该对象的输出,则该对象的两个状态是相同的。该封闭系统可能需要是一个独立的系统,能够独立于其环境执行。另一方面,可以允许它与相关对象本身一样小。在任何情况下,数学方法都将状态定义为等价类
“ 内部 ” 状态可以定义为表示状态。第一次尝试显然是循环的,但可能会有所帮助:“对象的内部状态是其成员的状态”。在这里,我们需要注意区分表示形式的重要方面和无关紧要的方面:在最低级别上,一个对象的表示形式很可能包括其他对象的地址,但是考虑更改该地址不太可能有用。作为状态变化。另一方面,对于查询结果而言,高速缓存状态的变化虽然对功能状态没有影响(如上所述),但在考虑性能测试时,这一点很重要。
IBM有一个词汇表,它以非常相似的几种不同定义来定义“状态”一词。他们没有特别声明它们与面向对象编程有关,但是可以在这种情况下推断和使用它们。
定义3:对象生命周期中的一个阶段,用于标识该对象的状态。
定义5:对象生命期内满足某种条件,执行某些活动或等待某种事件的条件或状况。
定义8:对象的特征体现在其公共和私有数据成员中,并且可以分为两类:基本状态和非基本状态。
定义9:在业务状态机中,是按顺序组织以构成业务交易的几个离散的单独阶段之一。
Def 10:一种状态,在该状态下,电路将一直保持到施加适当的脉冲为止。
韦伯斯特的《新世界大学词典》将“州”定义为:
一组在特定时间表征某人或事物的环境或属性;存在的方式或形式:条件
所有这些的共同点是时间。状态随着时间的推移而变化。这就是变量的性质。如果有人问:“您目前的状态是什么?” 您今天可以说您已婚,明天您可以单身。
考虑所有这些定义,可以推断出“状态”是对象在特定时间点存在的方式,该时间点由其属性的值(即其属性/变量)确定。
我认为没有比这更简单的了。
面向对象的系统使用“对象”的概念集成了代码和数据的术语。一个对象具有状态(数据)和行为(代码)。因此,对象的状态是包含数据的对象内部的实例(变量)。