通过包装父类的抽象方法达到结构和行为都统一
2012-06-04 13:11
162 查看
注:原发表在Hadoop技术论坛 |
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作设计时,时序图将显得更有条理性。
相关文章推荐
- 通过包装父类的抽象方法达到结构和行为都统一
- 通过ActiveX包装将桌面程序在IE下运行的方法
- 父类是抽象的类,子类实现了父类的抽象方法,在父类中应用到了抽象的方法,知道到底调用了那个子类。
- 1.类: 把具有相同属性和相似行为的一类食物称为类 相同的属性————》用数据来表示即可 相似的行为————》用方法或者函数表示即可 找出相似的行为和相同的属性的过程称为抽象
- 子类实现父类的抽象方法,父类调用抽象方法
- BFS(广度优先搜索)这里用来两种方法存储路径,1.同map大小的数组来存储路径2.通过生成反向树状结构存储路径
- 关于树形结构父类查子类,子类查父类的方法
- 开源搜索框架Lucene学习之分词器(3)——通过分词器源码学习抽象方法与虚方法的区别
- 子类实现父类的抽象方法,父类调用抽象方法
- java 抽象父类方法返回子类的类型
- 子类实现父类的抽象方法,父类调用抽象方法
- 子类实现父类的抽象方法,父类调用抽象方法
- 通过super调用父类属性和方法
- string方法 PadLeft 返回一个新字符串,该字符串通过在此实例中的字符左侧填充指定的 Unicode 字符来达到指定的总长度,从而使这些字符右对齐。 PadRight 右边
- 方法重写,抽象方法必须重写,抽象类。super.父类里面的方法调用方法。
- 子类实现父类的抽象方法,父类调用抽象方法
- Android studio快捷键重写继承父类的抽象方法
- 子类重载父类的非虚成员函数是否对从父类中继承且使用该成员函数的方法的行为产生影响
- java中,父类是抽象类不能通过工厂输出时,如何通过其他类实现输出的示例代码(工厂方法种类(1))
- 一种通过jdbc获取数据库结构的方法