首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

PL真有意思(七):数据抽象和面向对象

2019-12-20

现在假定三个类都有一个print_mailing_label办法,那么对x,y调用这个办法将会调用的是基类的Persion的办法,仍是依据现在变量引证的s、p的类型来做挑选呢?

第一种挑选是静态办法束缚,而第二种办法是动态办法束缚。动态办法束缚是面向目标程序设计的中心概念

C++和C#默许运用静态办法束缚,可是程序员可以将特定的办法标记为virtual,要求对它运用动态束缚。对虚办法的调用将在运行时依据目标的类而不是引证的类型指使恰当的办法完成

在大多数面向目标语言中,基类中都可以不给出virtual办法的体。在Java和C#中,做这件事的办法是将类或没有体的办法都标记为abstract

不管用什么语法办法,假如一个类中包括了至少一个笼统办法,这个类就称为是笼统的。咱们不可以声明笼统类的目标

关于静态办法束缚,编译器总可以根据所引证的变量的类型确认应该调用相应的办法的哪个版别。可是,关于动态束缚,被引证或指针变量所引证的目标中就有必要包括满足的信息,使编译器生成的代码可以在运行时找到正确的办法版别。

最常见的完成办法是用记载的办法表明每个目标,这种记载中第一个域是一个指针,指向该目标的类的虚办法表。虚表也便是一个数组,其间的第i个项指明该目标的第i个虚办法的代码地址。同一个类的一切目标同享同一个虚表。

动态办法束缚将多态性引进到期望某个基类foo的目标引证的一切代码中。只需派生类的目标支撑这个基类的操作,这些代码关于基类的任何派生类的目标都可以很好的作业。

有人可能会以为,有了承继和动态办法束缚后就不再需求泛型了,但实际情况并非如此,为了拜访这些派生类的特别内容,就有必要进行强制转化,而且得到的代码仍然是不安全的,可是泛型可以处理这些问题

有些时分,让一个派生类承继多个基类的特征也是十分有用的。例如咱们需求一个学生类,又期望可以便利进行添加删去,那么就可能期望从Person类和链表类派生出一个类来。

C++和Python都有多重承继。Java、C#则只提供了一种受限的多重承继办法。

在这一篇的一开始咱们指出了面向目标程序设计的三大基本概念:封装、承继和多态。在之后咱们评论了目标的初始化和完结操作、动态办法束缚和多重承继。

热门文章

随机推荐

推荐文章