类(计算机编程)

面向对象的编程, 一个班级是用于创建的可扩展程序编码模板对象,提供状态的初始值(成员变量)和行为的实施(成员功能或方法)。[1][2]在许多语言中,类名称用作类的名称(模板本身),默认的名称构造函数班级(a子例程创建对象)和类型实例化班级;这些不同的概念很容易混合在一起。[2]虽然,在混合点上,人们可以认为这是一种语言固有的特征,因为它具有多态性的性质,以及为什么与没有多态性的语言相比,这些语言如此强大,动态和适应性。因此,他们可以更轻松地对动态系统(即现实世界,机器学习,AI)进行建模。

当对象由类的构造函数创建时,将结果对象称为实例该类的和对象特定的成员变量被调用实例变量,与类变量在整个课程中共享。

实际上,在某些语言中,课程仅是编译时间功能(在运行时不能声明新类),而其他语言类是一流的公民,通常是本身(通常是类型的对象)班级或类似)。在这些语言中,在本身内创建类的类称为元类.

类与类型

在最随意的用法中,人们经常指一个物体的“类”,但是说话狭义的对像有类型:接口,即成员变量的类型,签名成员功能(方法),并且这些属性满足。同时,类具有实现(特别是方法的实现),并且可以使用给定的实现创建给定类型的对象。[3]在类型理论的术语中,类是一个实现 - ‌a具体的数据结构和子例程的集合‍-类型是界面。不同的(混凝土)类可以产生相同(摘要)类型的对象(取决于类型系统);例如,类型可以通过两个类实施 - 小扇区(对于小堆栈而快,但尺度较差)和Scalablestack(尺度很好,但高高的头顶用于小堆栈)。同样,给定类可能具有几个不同的构造函数。

类类型通常代表名词,例如一个人,地方或事物或某物名义上的,一个类代表这些实现。例如,香蕉类型可能代表属性和功能香蕉通常,阿布瓦纳纳xyzbanana课程将代表生产香蕉的方法(例如,香蕉供应商或数据结构和功能,可以在视频游戏中代表和绘制香蕉)。这阿布瓦纳纳然后可以产生特定的香蕉:阿布瓦纳纳类是类型的对象香蕉。通常只给出类型的单个实现,在这种情况下,类名称通常与类型名称相同。

设计和实施

类是由结构和行为成分组成的。[1]包含类作为编程构造的编程语言提供支持,用于各种类别相关的功能,并且使用这些功能所需的语法差异很大,从一种编程语言到另一种编程语言。

结构

课堂符号

一个类包含数据场地描述(或特性字段数据成员, 或者属性)。这些通常是在程序运行时与状态变量关联的字段类型和名称;这些状态变量要幺属于类的类或特定实例。在大多数语言中,按类定义的结构决定了其实例使用的内存的布局。其他实现是可能的:例如,对象Python使用关联键值容器。[4]

一些编程语言,例如Eiffel支持规范不变作为类的定义的一部分,并通过类型系统执行它们。封装状态对于能够执行班级的不变性是必要的。

行为

班级或其实例的行为是使用方法。方法是子例程具有在对像或类上操作的能力。这些操作可能会改变对象的状态,或者简单地提供访问该对象的方式。[5]存在许多种类的方法,但对它们的支持因语言而异。某些类型的方法是由程序员代码创建和调用的,而其他特殊方法(例如构造函数,驱动器和转换运算符)是由编译器生成的代码创建和调用的。语言还可以允许程序员定义并调用这些特殊方法。[6][7]

类界面的概念

每个班级工具(或者意识到)界面通过提供结构体和行为。结构由数据和状态组成,行为由指定方法的实现代码组成。[8]接口的定义与该接口的实现之间存在区别。但是,这一行在许多编程语言中都模糊不清,因为类声明既定义和实现界面。但是,某些语言提供了将接口和实现分开的功能。例如,一个抽像类可以在不提供实现的情况下定义接口。

支持类继承的语言还允许类从其派生的类中继承界面。

例如,如果“ A类”从“ B类”继承,并且“ B类”实现接口“接口B”,那么“类A”也继承了“接口B”提供的功能(常数和方法声明)。

用支持的语言访问说明符,类的界面被认为是类的公共成员集,包括方法和属性(通过隐式getter和setter方法);任何私人成员或内部数据结构均无意依赖外部代码,因此不是接口的一部分。

面向对象的编程方法学表明,类的任何接口的操作均应彼此独立。它产生了分层设计,接口客户端使用接口中声明的方法。接口没有要求客户以任何特定顺序调用一个接口的操作。此方法的好处是,客户码可以假设接口的操作可在客户端访问对象时可用。[9]

例子

电视机前面的按钮是您与塑料外壳另一侧的电气接线之间的接口。您按“电源”按钮以打开电视。在此示例中,您的特定电视是实例,每个方法都由一个按钮表示,所有按钮共同组成接口(其他与您的型号相同的电视集将具有相同的接口)。在其最常见的形式中,接口是一组相关方法的规范,而没有任何相关方法的实现。

电视机也有无数属性,例如大小以及是否支持颜色,共同构成其结构。一个类代表电视的完整描述,包括其属性(结构)和按钮(接口)。

获得制造的电视总数可能是静态方法电视课。该方法显然与类相关联,但不在类的每个实例的领域之外。从所有电视对象集合中找到特定实例的静态方法是另一个示例。

会员可访问性

以下是一组访问说明符[10]

  • 私人的(或者阶级私人)限制对类本身的访问。只有同一类的一部分的方法才能访问私人成员。
  • 受保护(或者班级保护)允许课程本身及其所有子类访问成员。
  • 上市意味着任何代码都可以通过其名称访问成员。

尽管许多面向对象的语言都支持上述访问说明符,但其语义可能会有所不同。

面向对象的设计将访问说明符与仔细的公共方法实现的仔细设计结合使用,以强制执行类别不变性 - 对象状态的构成。访问说明符的常见用法是将类的内部数据与界面分开:内部结构是私人的,而公共的登录方法可用于检查或更改此类私人数据。

访问说明符不一定控制能见度,因为即使是私人成员也可以看到客户外部代码。在某些语言中,可以在运行时引用一个无法访问但可见的成员(例如,由从成员函数返回的指针),但是尝试通过参考客户端代码的成员名称来使用它,将是由类型检查器阻止。[11]

各种面向对象的编程语言可实施成员的可访问性和各个程度的可见性,并取决于语言的类型系统和汇编政策,执行编译时间或者运行。例如,爪哇语言不允许访问类的私人数据来编译的客户端代码。[12]在里面C ++语言,私有方法是可见的,但在接口中不可访问;但是,可以通过明确声明代表该类界面的完全抽像类来使它们变得不可见。[13]

某些语言具有其他可访问性方案:

  • 实例与类可访问性红宝石支持实例私人实例保护分别代替阶级私人和阶级保护的访问说明符。它们的不同之处在于,他们根据实例本身而不是实例类限制访问权限。[14]
  • 朋友:C ++支持一种机制,其中函数明确声明为朋友功能班级可以访问指定为私人或受保护的成员。[15]
  • 基于路径:Java支持限制访问对成员的访问Java软件包,这是文件的逻辑路径。但是,在扩展Java框架以在与框架类同一包中实现类以访问受保护成员的类别的类时,这是一种常见的做法。源文件可能存在于完全不同的位置,并且可以部署到不同的.jar文件,但就JVM而言,仍然处于相同的逻辑路径中。[10]

阶层间关系

除了独立课程的设计外,编程语言还可以根据类之间的关系支持更高级的类设计。通常提供的类间关系设计功能是组成分层.

组成

类可以由其他类组成,从而在封闭类及其嵌入式类之间建立组成关系。班级之间的组成关系也通常被称为有个关系。[16]例如,可以由“汽车”类组成并包含“引擎”类。因此,汽车有一个引擎。组成的一个方面是遏制,它是由具有它们的实例的组件实例的围栏。如果封闭对象包含按值逐件的组件实例,则组件及其封闭对象具有相似的寿命。如果组件通过参考包含,则可能没有类似的寿命。[17]例如,在Objective-C 2.0中:

@界面nsObject@财产NSString*姓名@财产引擎*引擎@财产nsarray*轮胎@结尾

这个班级一个实例NSString(一个细绳目的),引擎, 和nsarray(数组对象)。

分层

可以衍生的从一个或多个现有类中,从而在派生类中建立层次结构关系(基础类父类或者超类)和派生类(儿童课或者子类)。派生类与派生类别类别的关系通常称为is-a关系。[18]例如,可以从类“控制”类派生“按钮”类。因此,一个按钮是一个控制。父母类的结构和行为成员是遗传由孩子课。派生的类还可以定义其他结构成员(数据字段)和行为成员(方法),除了它们继承因此专业他们的超类。此外,派生的类可以覆盖如果语言允许,则继承的方法。

并非所有语言都支持多种继承。例如,Java允许类实现多个接口,但仅从一个类中继承。[19]如果允许多个继承,则层次结构是定向无环图(或简称DAG),否则是。层次结构将类作为节点和继承关系作为链接。同一级别的课程更有可能联系比不同级别的课程。该层次结构的级别称为或者抽像水平.

示例(iPhone SDK的简化Objective-C 2.0代码):

@界面UirespondernsObject// ...@界面uiviewUiresponder// ...@界面UISCROLLVIEWuiview// ...@界面uitableviewUISCROLLVIEW// ...

在此示例中,uitableview是一个UISCROLLVIEW是一个uiview是一个Uiresponder是一个nsObject。

子类的定义

从概念上讲,超类是超集其子类。例如,一个共同的阶级层次结构涉及GraphicObject作为超级阶级长方形椭圆, 尽管正方形将是一个子类长方形。这些都是子集关系在集合理论中,即所有正方形都是矩形,但并非所有矩形都是正方形。

一个常见的概念错误是错误部分与子类的关系。例如,汽车和卡车都是各种各样的车辆,将它们建模为车辆类的子类是适当的。但是,将汽车的组件部分建模为子类关系是错误的。例如,汽车由发动机和车身组成,但是将发动机或车身作为汽车子类建模是不合适的。

面向对象的建模这些关系通常被建模为对象属性。在此示例中,课堂将有一个属性称为部分.部分将键入包含对象的集合,例如身体引擎轮胎等。对象建模语言,例如包括对“一部分”和其他类型关系的各个方面建模的功能 - 数据,例如对象的基数,输入和输出值的约束等。开发人员工具可以利用此信息来生成基本旁边的其他代码对象的数据定义,例如错误检查错误获取并设置方法.[20]

建模和实施对像类系统的一个重要问题是类是否可以拥有一个或多个超类。在具有实际集合的现实世界中,很少有人会发现与另一组不超过另一组相交的套件。但是,尽管某些口味和关闭的系统为多个父母在运行时提供了一种功能,这引入了复杂性,以对象为导向的社区中的许多人认为与首先使用对像类的目标相反。了解哪个类将负责处理消息时,在处理多个超级阶级时可能会变得复杂。如果不经意地使用,此功能可以引入一些相同的系统复杂性,并旨在避免使用模棱两可的类别。[21]

大多数现代面向对象的语言,例如SmallTalk和Java,都需要在运行时单一继承。对于这些语言,多个继承可能对建模可能有用,但对于实现而言无用。

然而,语义网应用对象确实有多个超类。互联网的波动性需要这种灵活性和技术标准,例如网络本体语言(OWL)旨在支持它。

一个类似的问题是,是否可以在运行时修改类层次结构。诸如口味,关闭和SmallTalk之类的语言都支持此功能作为其一部分元对象协议。由于类本身是一流的对象,因此可以通过向其发送适当的消息来使它们动态更改结构。其他专注于强大键入(例如Java和C ++)的语言不允许在运行时修改类层次结构。语义Web对象具有运行时间更改为类的功能。理性类似于允许多个超类的理由,以至于互联网是如此动态和灵活,以至于需要对层次结构进行动态变化才能管理这种波动性。[22]

班级概念和继承的正交性

尽管通常认为基于班级的语言支持继承,但继承不是类概念的内在方面。一些语言,通常称为“基于对象的语言“,支持类但不支持继承。基于对象的语言的示例包括视觉基本.

在面向对象的分析中

面向对象的分析并在, 一个协会两个类之间代表类或其相应实例之间的协作。联想有方向;例如,两个类之间的双向关联表明两个类都知道它们的关系。[23]协会可以根据其名称或目的标记。[24]

关联角色终结了关联,并描述了相应类的作用。例如,“订阅者”角色描述了“人”的班级实例参与“与“杂志”的“订阅”关联。此外,“杂志”在同一协会中具有“订阅杂志”角色。关联角色多重性描述了多少实例与关联的另一类的每个实例相对应。常见的多重性是“ 0..1”,“ 1..1”,“ 1 ..*”和“ 0 ..*”,其中“*”指定任何数量的实例。[23]

班级分类学

类别有许多类别,其中一些重叠。

抽象和混凝土

用支持继承的语言抽像类, 或者抽象基类(ABC),是一个无法实例化的类,因为它要幺标记为抽象,要幺简单地指定抽象方法(或者虚拟方法)。摘要类可以提供某些方法的实现,也可以通过签名这些将由抽像类的直接或间接后代实施。在可以实例化从抽像类派生的类中,其父类的所有抽象方法必须由派生链中的某些类实现。[25]

大多数面向对象的编程语言允许程序员指定哪些类被视为抽象,并且不允许这些类实例化。例如,在爪哇C#php,关键字抽象的用来。[26][27]C ++,一个抽像类是该语言中至少具有适当语法给出的至少一个抽象方法的类(C ++术语中的纯虚拟函数)。[25]

仅由虚拟方法组成的类称为纯抽象基类(或纯ABC)在C ++中,也称为界面由该语言的用户。[13]其他语言,尤其是Java和C#,支持一个抽像类的变体,称为界面通过语言中的关键字。在这些语言中,多元继承不允许,但是类可以实现多个接口。这样的类只能包含抽象的公开访问方法。[19][28][29]

一个混凝土类是可以是实例化,与抽像类别相反,不能。

本地和内部

在某些语言中,可以在范围除了全球范围。此类类别有多种类型。

一个内类是在另一类中定义的类。内部类及其包含类之间的关系也可以视为另一种类型的类关联。内部类通常既不与封闭类的实例相关联,也不与其封闭类实例化。根据语言,可能可能或不可能从封闭类外部参考课程。一个相关的概念是内部类型,也称为内部数据类型或者嵌套类型,这是对内部阶级概念的概括。C ++是支持内部类和内部类型的语言的一个示例(通过Typedef声明)。[30][31]

另一种类型是本地课程,这是在过程或函数中定义的类。这将对类名称的引用限制为在声明类的范围内。根据语言的语义规则,与非本地类别相比,本地类可能还有其他限制。一种常见的限制是禁止本地类方法访问封闭功能的本地变量。例如,在C ++中,本地类可能是指静态变量在其封闭功能中声明,但可能无法访问该函数的自动变量.[32]

元类

元类是其实例是类的类。[33]元类描述了一类类的共同结构,可以实现设计模式或描述特定类型的课程。元类通常用于描述构架.[34]

在某些语言中,例如Python红宝石或者短暂聊天,课程也是一个对象;因此,每个类都是内置在语言中的独特元类的实例。[4][35][36]常见的LISP对象系统(关闭)提供元对象协议(MOP)实现这些类和元素。[37]

不可分类

不可分类的类允许程序员设计类和层次结构的类别和层次结构,在层次结构中的某个级别,禁止进一步的派生(也可以将独立类别指定为不可分类的类别,以防止任何层次结构的形成)。与此对比抽象的班级暗示,鼓励和需要推导才能完全使用。不可分类的类是隐式的具体的.

通过将课程声明为sealed在C#或AS中final在Java或PHP中。[38][39][40]例如,爪哇String班级被指定为最后.[41]

不可分类的类可能允许编译器(以编译语言)执行不可用于子分类类别的优化。[42]

打开课

一个可以更改的开放式课程。通常,一个可执行程序客户无法更改。开发人员通常可以更改某些类,但通常无法更改标准或内置的类别。在红宝石,所有课程都是开放的。在Python,可以在运行时创建类,然后可以修改所有类。[43]Objective-C类别允许程序员将方法添加到现有类中,而无需重新编译该类,甚至可以访问其源代码。

混合物

有些语言对混合物,尽管在任何具有多种继承的语言中,混音只是一个不代表IS-A类关系的类。混合蛋白通常用于在多个类中添加相同的方法。例如,一个课程UnicodeConversionMixin可能会提供一种称为的方法unicode_to_ascii当包括在课堂中FileReaderWebPages craper不共享共同的父母。

部分的

在支持该功能的语言中部分类是一个类,其定义可以分为多个部分源代码文件或跨多个文件。[44]这些零件在编译时合并,使编译器输出与非机构类相同。

引入部分类别的主要动机是促进实施代码生成器, 如视觉设计师.[44]否则,开发代码生成器是一个挑战或妥协,这些代码生成器可以在开发人员写的代码中交错时可以管理生成的代码。使用部分类,代码生成器可以在文件中处理单独的文件或粗粒的部分类,因此可以通过大量解析,提高编译器效率并消除损坏开发人员代码的潜在风险,从而通过复杂地插入生成的代码来缓解。在简单的部分类别的实施中,编译器可以执行预兼容它“统一”部分类别的所有部分。然后,汇编可以照常进行。

部分类别功能的其他好处和效果包括:

  • 以唯一的方式启用类的界面和实现代码。
  • 放松在大型课程中的导航编辑.
  • 启用关注点分离,以类似的方式面向方面的编程但是不使用任何额外的工具。
  • 使多个开发人员可以同时处理单个类,而无需在以后将单个代码合并到一个文件中。

部分类别存在于短暂聊天以的名义类扩展在相当长的时间里。随着到来的到来.NET框架2微软引入了部分课程,两者都支持C#2.0和Visual Basic 2005.Winrt还支持部分课程。

vb.net中的示例

这个简单的例子,写在Visual Basic .net,显示如何在两个不同的文件中定义同一类的部分。

file1.vb
部分的班级我的课私人的_姓名作为细绳结尾班级
file2.vb
部分的班级我的课上市只读财产姓名()作为细绳得到返回_姓名结尾得到结尾财产结尾班级

汇编后,结果与两个文件一样,如以下方式相同:

班级我的课私人的_姓名作为细绳上市只读财产姓名()作为细绳得到返回_姓名结尾得到结尾财产结尾班级

Objective-C中的示例

Objective-C,部分类,也称为类别,甚至可以像以下示例一样分布在多个库和可执行文件上。但是关键区别在于,Objective-C的类别可以在另一个接口声明中覆盖定义,并且类别不等于原始类别的定义(第一个需要最后一个定义)。[45]相反,.NET部分类不能具有冲突的定义,并且所有部分定义均等于其他定义。[44]

在基础中,标题文件NSDATA.H:

@界面NSDATAnsObject-IDinitwithcontentsfurl:nsurl*URL// ...@结尾

在用户提供的库中,一个与基础框架的单独二进制文件,标头文件nsdata+base64.h:

#import <findown/fistion.h>@界面NSDATA(base64)-NSString*base64String-IDinitwithbase64string:NSString*base64String@结尾

在应用程序中,另一个单独的二进制文件,源代码文件main.m:

#import <findown/fistion.h>#import“ nsdata+base64.h”int主要的intargcchar*argv[]){如果argc<2返回exit_failureNSString*sourceurlstring=[NSStringStringWithCstringargv[1]];NSDATA*数据=[[NSDATAAlloc]initwithcontentsofurl[nsurlurlwithstringsourceurlstring]];nslog@“%@”[数据base64String);返回exit_success}

调度程序将在NSDATA实例上找到两种方法,并正确调用两个方法。

无力的

无法建立的课程允许程序员将无需类实例的运行时访问时间访问的每个类字段和方法组合在一起。确实,禁止对这种类别进行实例化。

例如,在C#中,标记为“静态”的类无法实例化,只能具有静态成员(字段,方法,其他),可能没有实例构造函数, 并且是密封.[46]

未命名

一个未命名的班级或者匿名课是一个不绑定到定义上名称或标识符的类。[47][48]这类似于命名未命名的功能.

好处

将软件组织成对像类的好处分为三类:[49]

  • 快速发展
  • 易于维护
  • 重复使用代码和设计

对像类有助于快速开发,因为它们减少了代码和用户之间的语义差距。系统分析师可以使用基本相同的词汇,谈论帐户,客户,账单等与开发人员和用户进行交谈。对像类通常会促进快速开发,因为大多数面向对象的环境都带有强大的调试和测试工具。可以在运行时间检查课程实例,以验证系统是否按预期执行。同样,大多数面向对象的环境没有获得核心内存的转储,而是解释了调试功能,以便开发人员可以准确分析程序中的位置,并且可以看到哪些方法被调用到哪些参数以及参数。[50]

对像类可通过封装来易于维护。当开发人员需要更改对象的行为时,他们可以将更改定位到该对象及其组件部分。这减少了维护增强的不必要副作用的潜力。

软件重复使用也是使用对像类的主要好处。类可通过继承和界面重复使用。当需要新的行为时,通常可以通过创建一个新类并让该类继承其超类的默认行为和数据来实现,然后相应地量身定制行为或数据的某些方面。当另一个对像想调用(而不是创建一种新型)某些对像类时,通过接口(也称为方法)重复使用。这种重复使用的方法会删除许多常见错误,这些错误可能会在一个程序中重新使用另一种程序时进入软件。[51]

运行时表示

作为数据类型,类通常被视为编译时构建体。[52]语言或库也可以支持原型或者工厂metaobjects代表有关类的运行时间信息,甚至代表提供访问权限的元数据反射设施和在运行时操作数据结构格式的能力。许多语言区分了这种语言运行时类型信息关于课程中的课程,基于运行时间不需要信息。某些动态语言在运行时和编译时构建体之间没有严格的区别,因此可能不会区分元主体和类。

例如,如果人是一个metaObject代表班级的人,可以使用人类的设施来创建班级人的实例metaObject.

也可以看看

笔记

  1. ^一个bGamma等。 1995,p。 14。
  2. ^一个b布鲁斯2002,2.1对象,类和对像类型,https://books.google.com/books?id=9ngwq3k1rwuc&pg=pa18.
  3. ^Gamma等。 1995,p。 17。
  4. ^一个b“ 3.数据模型”.Python语言参考。 Python软件基金会。检索2012-04-26.
  5. ^Booch 1994,p。 86-88。
  6. ^“班级(i)”.C ++语言教程。 cplusplus.com。检索2012-04-29.
  7. ^“(ii)课”.C ++语言教程。 cplusplus.com。检索2012-04-29.
  8. ^Booch 1994,p。 105。
  9. ^贾姆里奇(Jamrich),帕森斯(Parsons),6月(2015-06-22)。新观点计算机概念,2016年。综合。马萨诸塞州波士顿。ISBN 9781305271616.OCLC 917155105.
  10. ^一个b“控制对班级成员的访问”.Java教程。 Oracle。检索2012-04-19.
  11. ^“ OOP08-CPP。请勿返回对私人数据的参考”.证书C ++安全编码标准。卡内基·梅隆大学。2010-05-10。存档原本的在2015-10-03。检索2012-05-07.
  12. ^Ben-Ari,Mordechai(2007-01-24)。“ 2.2标识符”(PDF).Java中的编译和运行时错误.存档(PDF)从2011-10-18的原始。检索2012-05-07.
  13. ^一个b狂野,弗雷德。“ C ++接口”.Dobb博士。 UBM TechWeb。检索2012-05-02.
  14. ^托马斯;打猎。“类,对象和变量”.编程Ruby:务实的程序员指南。 ruby-doc.org。检索2012-04-26.
  15. ^“友谊和继承”.C ++语言教程。 cplusplus.com。检索2012-04-26.
  16. ^Booch 1994,p。 180。
  17. ^Booch 1994,p。 128-129。
  18. ^Booch 1994,p。 112。
  19. ^一个b“接口”.Java教程。 Oracle。检索2012-05-01.
  20. ^贝尔费尔德,玛丽(2008年12月2日)。“ IBM理性软件架构师版和相关软件中的UML到Java转换”.IBM。检索12月20日2013.
  21. ^雅各布森,伊瓦尔;马格努斯·克里斯特森(Magnus Christersson)帕特里克·琼森(Patrik Jonsson);Gunnar Overgaard(1992)。面向对象的软件工程。 Addison-Wesley ACM出版社。 pp。43–69.ISBN 0-201-54435-0.
  22. ^Knublauch,Holger;奥伯尔,丹尼尔;菲尔·特特洛(Tetlow);华莱士,埃文(2006-03-09)。“面向对象的软件开发人员的语义Web底漆”.W3C。检索2008-07-30.
  23. ^一个b贝尔,唐纳德。“ UML基础:类图”.开发人员工作。 IBM。检索2012-05-02.
  24. ^Booch 1994,p。 179。
  25. ^一个b“多态性”.C ++语言教程。 cplusplus.com。检索2012-05-02.
  26. ^“抽象方法和类”.Java教程。 Oracle。检索2012-05-02.
  27. ^“班级抽象”.PHP手册。 PHP组。检索2012-05-02.
  28. ^“接口(C#编程指南)”.C#编程指南。微软。检索2013-08-15.
  29. ^“继承(C#编程指南)”.C#编程指南。微软。检索2012-05-02.
  30. ^“嵌套类(仅C ++)”.AIX的XL C/C ++ V8.0。 IBM。检索2012-05-07.
  31. ^“本地类型名称(仅C ++)”.AIX的XL C/C ++ V8.0。 IBM。检索2012-05-07.
  32. ^“本地类(仅C ++)”.AIX的XL C/C ++ V8.0。 IBM。检索2012-05-07.
  33. ^Booch 1994,p。 133-134。
  34. ^“ 13堂课和元类”.pharo.gforge.inria.fr。检索2016-10-31.
  35. ^托马斯;打猎。“类和对象”.编程Ruby:务实的程序员指南。 ruby-doc.org。检索2012-05-08.
  36. ^Booch 1994,p。 134。
  37. ^“拖把:概念”.公共LISP对象系统元对象协议。LISP用户协会。存档原本的在2010-11-15。检索2012-05-08.
  38. ^“密封(C#参考)”.C#参考。微软。检索2012-05-08.
  39. ^“编写最终课程和方法”.Java教程。 Oracle。检索2012-05-08.
  40. ^“ PHP:最终关键字”.PHP手册。 PHP组。检索2014-08-21.
  41. ^“字符串(Java Platform SE 7)””.Java平台,标准版7:API规范。 Oracle。检索2012-05-08.
  42. ^Brand,SY(2020年3月2日)。“最终课程的表现优势”.Microsoft C ++团队博客。微软。检索4月4日2020.
  43. ^“ 9.课”.Python教程。 python.org。检索3月3日2018.就像模块一样,类别的类别属于Python的动态性质:它们是在运行时创建的,可以在创建后进一步修改。
  44. ^一个bcMairaw;比尔瓦格纳;Tompratt-AQ(2015-09-19),“部分类别和方法”C#编程指南,微软,检索2018-08-08
  45. ^苹果(2014-09-17),“定制现有类”用Objective-C进行编程, 苹果,检索2018-08-08
  46. ^“静态类和静态类成员(C#编程指南)”.C#编程指南。微软。检索2012-05-08.
  47. ^“匿名类(Java™教程>学习Java语言>类和对象)”.docs.oracle.com。检索2021-05-13.
  48. ^“ PHP:匿名课程 - 手册”.www.php.net。检索2021-08-11.
  49. ^“什么是对象?”.Oracle.com。 Oracle Corporation。检索12月13日2013.
  50. ^布希,格雷迪;Robert A. Maksimchuk;迈克尔·恩格尔(Michael W. Engle);Bobbi J. Young博士;吉姆·康纳伦(Jim Conallen);凯利·休斯顿(Kelli A. Houston)(2007年4月30日)。带有对象的分析和设计。 Addison-Wesley专业人士。 pp。1-28。ISBN 978-0-201-89551-3。检索12月20日2013.人类认知的基本限制因素;我们可以通过使用分解,抽象和层次结构来解决这些约束。
  51. ^雅各布森,伊瓦尔;马格努斯·克里斯特森(Magnus Christersson)帕特里克·琼森(Patrik Jonsson);Gunnar Overgaard(1992)。面向对象的软件工程。 Addison-Wesley ACM出版社。ISBN 0-201-54435-0.
  52. ^“ C ++国际标准”(PDF).工作草案,编程语言的标准C ++。ISO/IEC JTC1/SC22 WG21。存档(PDF)从2017-12-09的原始。检索1月5日2020.

参考

进一步阅读