返回介绍

11.19 抽象类与虚拟方法

发布于 2020-09-09 22:55:49 字数 1043 浏览 1000 评论 0 收藏 0

我们可以产生一组类,它们可以看作是来源于一个共用的基类。例如,一个类型为BasePacket的公用基类设置了一个包的初始结构,但这个结构并不完整,因此它永远也不会被实例化。然而从这个基类开始,我们可以派生许多子类,例如以太网包、令牌环包、GPSS包、卫星包。这些包的每一个可能看上去很相似,它们都需要相同的方法集合,但它们在内部的实现细节上则存在明显的不同。

一个基类设置了其子类的原型。由于设置基类的目的就不是为了实例化,所以可以将类指定成virtual以便使其变得抽象:

virtual class BasePacket;

抽象类还可以具有虚拟方法。虚拟方法是一个基本的多态性结构。一个虚拟方法过载所有基类中的一个方法,而一个普通的方法则只能过载该类及其后代类中的一个方法。看待这个问题的一个方面是每个类层次的一个虚拟方法只有一个实现,并且它总是位于最后一个继承类。虚拟方法为子例程提供了原型,所有的信息基本上都可以在一个方法声明的第一行找到:封装标准、参数的类型和数目、如果需要的话还包括返回类型。当子类在以后过载成员方法的时候,它们必须完全地遵从那个原型。因此,虚拟方法的所有版本在所有的子类中看上去都是相同的:

virtual class BasePacket;
    virtual function integer send(bit[31:0] data);
    endfunction
endclass

class EtherPacket extends BasePacket;
    function integer send(bit[31:0] data);
        // 函数体
        ...
    endfunction
endclass

现在,EtherPacket是一个可以被实例化的类。通常,如果一个抽象类具有虚拟方法,为了使子类能够被实例化,所有这些方法都必须被过载(并且拥有一个方法体)。如果任何虚拟方法没有具体的实现,那么子类需要是抽象的。

一个抽象类可以包含只有一个原型而没有具体实现的方法(也就是不完整的类)。一个抽象类不能被实例化,它只能被继承。普通类的方法也可以被声明成虚拟的。在这种情况下,方法必须具有一个方法体。如果这个方法具有一个方法体,那个这个类以及它的子类可以被实例化。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文