从函数调用来思考多态

在平常写程序的时候,经常会遇到两个函数,明明传入的参数和传值的值都相同,但就是里面的内容略有不同(也就是业务逻辑稍有不同)

     void f1(int num1,int num2){
        console.write("我是f1");
    }
     void f2(int num1,int num2){
        console.write("我是f2");
    }

对于代码略有不同的函数,经常的一个处理方案是:通过增加一个参数,传入一个值,然后进行判断,以便正确地选用那一点点不同的处理。(如下面片段)

     void f(int num1,int num2,bool isFirst){
         if(isFirst==true){
         console.write("我是f1");
         }else{
         console.write("我是f2");
         }
    }

但是这么做有不好的地方,就是增加了代码阅读者的思考量,另外,当相同逻辑的代码不是两个、三个、而是更多的时候,选用那一段业务代码的判断就会随之增多,并且这样很不利于后面程序的拓展

此时如果两个函数有一个公共的基类。通过传递对象的方式,整个程序就变得优雅起来了。(见下面代码)

class Base{
    public virtual void f(int num1,int num2){
         console.write("我是基类的f函数");
    }
}
class Sub1:public Base{
    public override void f(int num1,int num2){
        console.write("我是Sub1的f函数");
}
class Sub2:public Base{
    public override void f(int num1,int num2){
        console.write("我是Sub2的f函数");
}
public void use_f(Base * MyBase)
{
    MyBase.f();
}
void main(){
    Base  base1 = new Sub1();
    Base  base2 = new Sub2();
    //Do Something...
    //下面根据逻辑代码调用f函数
    use_f(base1);
    use_f(base2);
}

总结

以上是我对多态的理解,让多态可以通过调用传递对象的方式,实现特定的函数的动态调用。当然也可以通过反射来动态调用函数。反射还没有认真学习过,且先放着,后面研究。

作者:kissazi2 
出处:http://www.cnblogs.com/kissazi2/ 
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/kissazi2/archive/2012/10/22/2733222.html

时间: 2024-08-01 19:12:36

从函数调用来思考多态的相关文章

java面向对象(五)之多态

多态 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是为了重用父类代码.两个类若存在IS-A的关系就可以使用继承.,同时继承也为实现多态做了铺垫.(我的关于继承的博客http://www.cnblogs.com/yangliguo/p/7481550.html) 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译

Android 2017面试题整理

似乎自去年下半年以来,大家跳槽的少了,还有有些公司裁员了,前几年火热的移动端.前端岗位也越来越少,回归理性.现在各大公司对移动Android/ios的需求基本要求都是三年以上相关经验,有过大型互联网项目经验,基础扎实.那么对于我们从事Android开发的程序员,我们究竟需要掌握哪些技术呢?面试官究竟会问什么呢?今天,结合我的面试经验,给大家整理一下. Android常见面试题整理 以我的经验,面试基本都是简单到原理循序渐进的过程,所以这里整理的时候也遵循这个思路. 1,Activity的启动模式

Think in ActionScript 3.0Ⅱ

5.多态(Polymorphism) 5.1 多态的概念 面向对象的三大特性 :封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的. 这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同 类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种 不同的行为方式.(发送消息就是函数调用) 实现多态的技术称为:动态 绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其 实际的类型调用其相应的方法. 多态的作用:消除类型之间

C++对象布局及多态实现探索之虚函数调用

我们再看看虚成员函数的调用.类C041中含有虚成员函数,它的定义如下: struct C041{C041() : c_(0x01) {}virtual void foo() { c_ = 0x02; }char c_;}; 执行如下代码: C041 obj;PRINT_DETAIL(C041, obj)PRINT_VTABLE_ITEM(obj, 0, 0)obj.foo();C041 * pt = &obj;pt->foo(); 结果如下: The detail of C041 is 14

《面向对象的思考过程(原书第4版)》一1.10 多态

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.10节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 1.10 多态 多态是一个希腊词,字面上理解为许多形状.尽管多态与继承是紧耦合的关系,但它通常单独作为面向对象技术中最强大的优点之一.当向一个对象发送一个消息时,该对象必须定义一个方法来响应这个消息.在继承体系图中,所有的子类从它们的超类中继承接口.然而,由于每个子类是单独

C++对象布局及多态之虚成员函数调用

在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解.这个问题也和一般直观上的认识有所差异.先看看下面的两个类定义. struct C180 { C180() { foo(); this->foo(); } virtual foo() { cout << "<< C180.foo this: " << this << " vtadr: " << *(

《像计算机科学家一样思考Python》——第3章 函数 3.1 函数调用

第3章 函数 3.1 函数调用 在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合.定义一个函数时,需要指定函数的名称并写下一系列程序语句.之后,就可以使用名称来"调用"这个函数.前面我们已经见过函数调用的例子: >>> type(32) <type 'int'> 这个函数的名称是type,括号中的表达式我们称之为函数的参数.这个函数调用的结果是参数的类型. 我们通常说函数"接收"参数,并"返回"结果.

《面向对象的思考过程(原书第4版)》一 导读

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.2节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 前 言本书内容概要正如书名所述,本书讲述了面向对象思考的过程.选择一本书的主题和书名是个很重要的决定,但如果主题概念性很强,决定就没那么容易了.大部分书籍都只涉及了编程及面向对象设计的某个方面.一些主流的书阐述了诸如面向对象分析.面向对象设计.面向对象编程.设计模式.面向对象

Closure Compiler 高级模式及更多思考

前言 Google Closure Compiler 是 Google Closure Tools 的一员,在 2009 年底被 Google 释出,早先,有 玉伯 的 Closure Compiler vs. YUICompressor,主要就 压缩率 上进行了对比,另外有 承玉 的 应用 closure compiler 高级模式,对 CC 的高级模式做了些介绍 本文将详细介绍 CC 的高级模式部分,更重要的是,阐述 CC 高级模式背后的思考 CC 是真正的编译器 Closure Compi