方法(计算机编程)
一个方法在面向对象的编程(OOP)是程序与信息和目的。一个对象包括状态数据和行为;这些构成界面,它指定了其各种消费者如何使用对象。方法是由消费者参数参数的对象的行为。
数据表示为特性物体和行为表示为方法。例如,窗户
对象可能具有诸如打开
和关
,而其状态(无论是在任何给定时间点开放还是关闭)将是财产。
在基于班级的编程,在一个中定义了方法班级,对像是实例给定课程。方法提供的最重要功能之一是方法覆盖 - 同名(例如,区域
)可用于多种不同类型的类。这允许发送对象调用行为,并将这些行为的实现委托给接收对象。一种方法爪哇编程设置类对象的行为。例如,一个对象可以发送区域
消息给另一个对象,并调用适当的公式是否是接收对像是一个长方形
,圆圈
,三角形
, ETC。
方法还提供了其他类用于访问和修改对象属性的接口;这被称为封装。封装和覆盖是方法和过程调用之间的两个主要区别特征。[1]
覆盖和超载
方法覆盖过载是方法与常规过程或函数调用不同的两种最重要的方法。覆盖是指重新定义其超类方法的实现的子类。例如,Findarea
可能是形状类定义的方法,[2]三角形
等等,每个都会定义适当的公式来计算其面积。这个想法是将对象视为“黑匣子”,以便对对象的内部更改可以对使用它的其他对象产生最小的影响。这被称为封装,旨在使代码更易于维护和重复使用。
另一方面,方法过载是指根据方法的参数来区分用于处理消息的代码。如果一个人将接收对象视为任何方法中的第一个参数,那么覆盖只是选择仅基于第一个参数的特殊情况。以下简单的Java示例说明了以下区别:
登录器,突变器和管理器方法
登录方法用于读取对象的数据值。突变器方法用于修改对象的数据。经理方法用于初始化和破坏类的对象,例如构造函数和破坏者。
这些方法提供了抽象层这有助于封装和模块化。例如,如果银行帐户类提供getBalance()
登录方法检索当前平衡(而不是直接访问余额数据字段),然后稍后修订相同的代码可以实现更复杂的机制来检索平衡(例如,数据库提取),无需更改因代码。封装和模块化的概念不是面向对象的编程所独有的。确实,从许多方面来说,面向对象的方法只是先前范式的逻辑扩展,例如抽像数据类型和结构化编程.[3]
构造函数
一个构造函数是一种在对像生命周期开始时称为创建和初始化对象的方法,一个称为对象的过程建造(或者实例化)。初始化可能包括对资源的收购。构造函数可能具有参数,但通常不会在大多数语言中返回值。请参阅Java中的以下示例:
上市班级主要的{细绳_姓名;int_卷;主要的(细绳姓名,int卷){//构造方法这个._姓名=姓名;这个._卷=卷;}}
破坏者
一个驱动器是一种在对象寿命结束时自动称为自动称为的方法破坏。大多数语言的破坏不允许驱动器方法参数也不返回值。可以实施破坏,以便在对象破坏时执行清理琐事和其他任务。
最终化器
在垃圾收集语言,例如爪哇,C#, 和Python,破坏者被称为最终化器。它们具有与破坏者相似的目的和功能,但是由于使用垃圾收集的语言之间的差异和使用手动内存管理的语言,因此称为它们的顺序是不同的。
抽象方法
一个抽象方法是一个只有一个签名和不实施机构。通常用来指定子类必须提供该方法的实现。抽象方法用于指定接口在某些编程语言中。[4]
例子
以下爪哇代码显示一个需要扩展的抽像类:
抽象的班级形状{抽象的int区域(inth,intw);//抽象方法签名}
以下子类扩展了主要类:
上市班级长方形扩展形状{@Overrideint区域(inth,intw){返回h*w;}}
重新提取
如果子类为抽象方法提供实现,则另一个子类可以使其再次抽象。这就是所谓的重新提取.
实际上,这很少使用。
例子
在C#中,可以使用抽象方法覆盖虚拟方法。(这也适用于Java,其中所有非私有方法都是虚拟的。)
班级ia{上市虚拟的空白m(){}}抽象的班级IB:ia{上市覆盖抽象的空白m();//允许}
接口的默认方法也可以重新吸收,需要子类实现它们。(这也适用于Java。)
界面ia{空白m(){}}界面IB:ia{抽象的空白ia.m();}班级C:IB{}//错误:类'C'不实现'ia.m'。
类方法
类方法是在班级而不是实例。它们通常用作对象的一部分元模型。即,对于每个类,都创建了元模型中的类对象的实例。元模型协议允许创建和删除类。从这个意义上讲,它们提供的功能与上述构造函数和破坏者相同。但是在某些语言中,例如常见的LISP对象系统(关闭)元模型允许开发人员在运行时动态更改对像模型:例如,创建新类,重新定义类层次结构,修改属性等。
特殊方法
特殊方法是非常特定于语言的,语言可能支持此处定义的任何特殊方法。语言的编译器可以自动生成默认的特殊方法,也可以允许程序员可以选择定义特殊方法。大多数特殊方法不能直接调用,而是编译器生成代码在适当的时间调用。
静态方法
静态方法旨在与类的所有实例相关,而不是与任何特定实例有关。他们类似静态变量从这个意义上讲。一个示例将是一种静态方法,以总结类的每个实例的所有变量的值。例如,如果有一个产品
类可能具有静态方法来计算所有产品的平均价格。
在Java中,一种常用的静态方法是:
Math.max(双A,双B)
这种静态方法没有所有对象,也不在实例上运行。它从其论点中收到所有信息。[2]
即使尚无类的实例,也可以调用静态方法。静态方法称为“静态”,因为它们已解决编译时间基于类,它们被调用,而不是在实例方法中,而不是在动态上,这些方法是根据对象的运行时类型来解决的。
拷贝性分配操作员
复制分配运算符定义要由编译器执行的操作当类对象分配给同一类型的类对象时。
操作员方法
操作员方法定义或重新定义操作员符号并定义要使用符号和关联的方法参数执行的操作。C ++示例:
#包括 班级数据{上市:布尔操作员<(const数据&数据)const{返回卷_<数据.卷_;}布尔操作员==(const数据&数据)const{返回姓名_==数据.姓名_&&卷_==数据.卷_;}私人的:标准::细绳姓名_;int卷_;};
成员在C ++中的功能
一些程序语言具有面向对象的功能,以利用这些语言的大型技能和旧版代码,但仍提供面向对象的开发的好处。也许最著名的例子是C ++,面向对象的扩展C编程语言。由于设计要求将面向对象的范式添加到现有的程序语言中,因此传递C ++的消息具有一些独特的功能和术语。例如,在C ++中,一种方法称为成员功能。 C ++还具有虚拟功能哪些是可以是的成员函数覆盖在派生的类并允许动态调度.
虚拟功能
虚拟功能是C ++类可以实现多态性行为的手段。非虚拟成员功能, 或者常规方法,那些不参加的人多态性.
C ++示例:
#包括 #包括 班级极好的{上市:虚拟的~极好的()=默认;虚拟的空白我是(){标准::cout<<“我是超级班级!\ n";}};班级子:上市极好的{上市:空白我是()覆盖{标准::cout<<“我是子类!\ n";}};int主要的(){标准::unique_ptr<极好的>Inst1=标准::make_unique<极好的>();标准::unique_ptr<极好的>Inst2=标准::make_unique<子>();Inst1 - >我是();//呼叫| super :: iam |。Inst2 - >我是();//呼叫| sub :: iam |。}
也可以看看
笔记
参考
- Jana,Debasish(2005年1月1日)。C ++和面向对象的编程范例。 Phi Learning Pvt。有限公司ISBN 978-81-203-2871-6.
- Sengupta,Probal(2004年8月1日)。面向对象的编程:基本原理和应用程序。 Phi Learning Pvt。有限公司ISBN 978-81-203-1258-6.
- Svenk,Goran(2003)。面向对象的编程:将C ++用于工程和技术。圣智学习。ISBN 0-7668-3894-3.
- Balagurusamy(2013)。用C ++面向对象的编程。塔塔·麦格劳 - 希尔教育。ISBN 978-1-259-02993-6.
- Kirch-Prinz,Ulla; Prinz,Peter(2002)。C ++编程的完整指南。琼斯和巴特利特学习。ISBN 978-0-7637-1817-6.
- 康格,大卫(2006)。在C ++中创建游戏:逐步指南。新车手。ISBN 978-0-7357-1434-2.
- Skinner,M。T.(1992)。高级C ++书。矽出版社。ISBN 978-0-929306-10-0.
- 爱情(2005年9月1日)。Linux内核开发。皮尔逊教育。ISBN 978-81-7758-910-8.
- Dehuri,Satchidananda;Jagadev,Alok Kumar;Rath,Amiya Kumar(2007年5月8日)。使用C ++的面向对象的编程。 Phi Learning Pvt。有限公司ISBN 978-81-203-3085-6.