zoukankan      html  css  js  c++  java
  • 从虚函数看OOP的继承

    面向对象编程的一个重大功能就是“继承”,它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

    从“继承”的特点来看,继承的作用之一,就是可以使派生类无差别的使用基类的方法,以实现逻辑的重用。

    但从虚函数,尤其是纯虚函数来看,“继承”的作用更多的在于“逻辑的分层”,以实现模块间的松耦合。

    举个例子,如:

    class Logger

    {

    public:

    virtual void LOG(char * info) = 0;


    }


    void func(Logger logger)

    {

    // do something

    logger.LOG("func exit.");

    }

    对于class Logger而言,其有一个纯虚函数LOG(我们将其定义为记录日志的功能逻辑),另外一个函数func在退出时调用了LOG方法,记录函数退出。

    为什么会这样去实现?

    在实际的项目中,代码架构往往分不同的模块/层次,对于基于Base开发的模块/系统,可能有不同的日志格式诉求。

    按照传统的思想,如果基于Logger的系统有不同的诉求,那么就提供不同的LOG方法不就行了?

    这样的想法,往往是灾难性的。实际运作过程中的极端情况下,Logger类的系统往往在一个团队中维护,而基于Logger开发的系统可能在另一个团队、甚至另外的企业。如果按照传统的思想,两个团队之间的“耦合”就产生了。

    这个时候,“继承”就派上用场了,基于Logger开发的系统,完全可以重写自己的日志函数:


    class NewLogger : public Logger

    {

    public:

    void LOG(char * info) 

    {

    // ...

    }

    }


    在调用func函数时,只需要如下调用即可:

    NewLogger newLogger;

    func(newLogger);


    “分层”的思想作为计算机体系中解决问题的一种最常用思路,OOP中的继承从一定程度上讲正是迎合该思想而产生的,类似于C语言中的“回调函数”机制。SOLID设计原则中的“依赖倒转原则”正是通过“继承”来支撑的。




  • 相关阅读:
    vue3.0提前了解系列一 通过cli快速搭建一个3.0项目
    vscode卡的飞起解决办法-其中之一
    常用正则表达式整理
    jq-outerhtml不能执行新元素内部的js解决方案
    前端面试题(亲身面试经验)
    MAC上Cisco AnyConnect删除不干净,造成无法重新安装的解决办法
    vue需要知道哪些才能算作入门以及熟练
    jquery版本轮播图(es5版本,兼容高)
    webpack4常用片段
    前端速度优化
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3040936.html
Copyright © 2011-2022 走看看