通过包装父类的抽象方法达到结构和行为都统一

注:原发表在Hadoop技术论坛

在进行OO时,很容易做到结构统一,这个也容易理解,如下:

class Parent

{

public:

    virtual void hello() = 0;

};



class Child1: public Parent

{

private:

    virtual void hello() {

        printf("Child1\n"); // 当运行到这里时,调用栈显得和Parent毫无关系

    }

};



class Child2: public Parent

{

private:

    virtual void hello() {

        printf("Child2\n"); // 当运行到这里时,调用栈显得和Parent毫无关系

    }

};



int main() {

    Parent* p = new Child2;

    p->hello();

    return 0;
}

在上面的设计中,结构是统一的,对外展现的是Parent,但是行为并非统一,当使用gdb打印调用栈时,是看不到Parent的影子的,当系统庞大后,对新人来理解系统会增加一些阻力。如何解决这个问题了?通过统一行为,就可以将这个清晰化。方法是:在Parent中增加一个非抽象方法,由这个新增加的非抽象方法来调用hello,这样在调用栈中就可以见到Parent的身影了,调用栈显示有层次感,有助于理解系统。

class Parent

{

public:

    /* virtual */ void hello() {

        do_hello();

    }

 

private:

    virtual void do_hello() = 0;

};



class Child1: public Parent

{

private:

    virtual void do_hello() {

        printf("Child1\n"); // 当运行到这里时,调用栈中会包含Parent -> Child1信息

    }

};



class Child2: public Parent

{

private:

    virtual void do_hello() {

        printf("Child2\n"); // 当运行到这里时,调用栈中会包含Parent -> Child2信息

    }

};



int main() {

    Parent* p = new Child2;

    p->hello();

    return 0;

}

上面的修改,简单来看,除了增加代码和调用次数的缺点外,没有带来任何好处,但软件开发实则为一项工程性的工作,需要考虑到整体性和外部因素等,个人觉得这样做很值得,特别是当你使用UML作设计时,时序图将显得更有条理性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维技术迷

MySQL数据库(二):基本管理

安装环境: 操作系统版本:RHEL 6.5 安装版本:MYSQL 5.1 升级版本:MYSQL 5.6 一、默认库介绍 安装完成之后,mysql会自动创...

3396
来自专栏岑志军的专栏

WKWebView常见功能及如何返回上级界面

2503
来自专栏移动端周边技术扩展

解决H5微信支付返回跳转问题

9743
来自专栏雨尘分享

iOS 和 H5 交互那些事 (UIWebView、WKWebView 总结篇)

1.4K5
来自专栏朱慕之的博客

WKWebView

我们要通过JS与webview内容交互,就需要到这个类了,它的所有属性及方法说明如下:

1571
来自专栏乐沙弥的世界

Linux 下配置 HugePages

    HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以...

1024
来自专栏腾讯Bugly的专栏

WKWebView 那些坑

导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用、内存泄漏的 UIWebView。...

93113
来自专栏余生开发

微信小程序开发-网络请求wx.request封装

const request = (url, data, successCallback, errorCallback) => {

8313
来自专栏向治洪

IOS WebView控件详解

概述 WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用...

7267
来自专栏移动端开发

Swift 2.0 UIAlertView 和 UIActionSheet 的使用

 在 IOS 9.0 之后, UIAlertView  是 给废弃了的,虽然你要使用的话,暂时还是可以的,但是在 9.0 之后,IOS 推荐大家使用的是  UI...

2189

扫码关注云+社区

领取腾讯云代金券