i3geek.com
闫庚哲的个人博客

面向过程、面向对象、基于对象和继承、派生、多态分别的区别

“面向对象”和“基于对象”的区别

“面向对象”的三大特点(封装,继承,多态)缺一不可。

“基于对象”是使用对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说“基于对象”没有继承的特点。而“多态”表示为父类类型的子类对象实例,没有了继承的概念也就无从谈论“多态”。

很多流行技术都是基于对象的,它们使用一些封装好的对象,调用对象的方法,设置对象的属性。但是它们无法让程序员派生新对象类型。他们只能使用现有对象的方法和属性。

所以当你判断一个新的技术是否是面向对象的时候,通常可以使用后两个特性来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了“继承和多态”,而“基于对象”没有实现这些。

“面向过程”和“面向对象”的区别

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

可以拿生活中的实例来理解面向过程与面向对象,例如设计五子棋游戏:

面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。

“继承”和“派生”的区别

其实“派生”,跟“继承”是一回事,只是看它们的角度不一样而已

比如下面这段程序,我们可以说:
类Base派生了类Derived,也可以说类Derived继承了类Base

class Base
{
  private:
  int m_i;
};

class Derived : public Base
{
  private:
  int m_x;
};

“继承”和“多态”的区别

继承:子类继承父类中所以的属性和方法,但是对于private的属相和方法,由于这个是父类的隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引用,所以相当于没有继承到。很多时候,可以理解为,没有继承。

多态:就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。
可以这么说:编译时看父类,运行时看子类。

举一个比较容易理解的例子。主人公:李启铭、李刚。经典语录:我爸是李刚

从李启铭说的那句:我爸是李刚,是很有科学依据的,用程序设计的原理看,它符合继承和多态的面向对象编程的这2大特性。

继承就是子类可以继承父类中的属性和方法。包括私有的属性和方法,只是由于私有的方法无法访问,所以相当于没有继承到,其实是包含在子类中的。

public class 李刚{
       private String 有钱;
       private String 有权;
       private String 飞扬跋扈;
       private String 装;
       .............
       .....相应的get/set方法....
      
       public void 爱喝酒(){
             .......
       }    
    ............
}
以上就是李启铭老爸李刚的一些属性和方法。
public class 李启铭 extends 李刚{
       private  String  二;
       public void 敢开车撞人(){
               .........
       }
}

在李启铭中我们好像看不到李刚的影子,其实李刚的优良基因都被李启铭继承到了。如果你有IDE开发程序你就能看到这些方法是在李启铭中的。像有钱、有权、飞扬跋扈等等都被他儿子有拥有!但是青出于蓝而胜于蓝啊,李启铭还有他自己的一些特性,这些东西是李刚所不具有的,像二啊、敢开车撞人啊,他老爸是无论如何也干不出来的。

这也就是子类可以看做父类,但是也不完全相同,因为子类可能有父类不具有的属性和方法,也就是儿子可能干出父亲干不出来的事(也就是子类中特有的方法)。

好了,继承也就差不多了,来看看多态吧。我们还是用这个例子。

多态:就是父类引用可以持有子类对象,目的是为了更加通用的编程。

还是上面那两个类:李启铭和李刚。现在我们要把这两个东西实例化了。(挺可怕的!)

先分别实例化:

李刚 aa = new 李刚();

这样我们就可以用李刚的一些属性了。

李启铭 bb = new 李启铭();

我们同样可以用李启铭中的一些方法了。

但是,李启铭就是一个官二代,如果没有李刚就什么都不是了。所以在很多时候李启铭就是他老爸李刚的形象,见李启铭如见李刚。

李刚 cc = new 李启铭();

嘿嘿,这也就当我们看到李启铭的时候,其实我们惧怕的不是李启铭这小瘪三,而是他的老爸李刚,所以我们其实就把李启铭当做了李刚。但是李启铭和李刚还是有区别的啊,李启铭比李刚二,敢撞人,这可是他老爸干不出来的。

所以当我们这样的时候 李刚 cc = new 李启铭();这个cc对象只能调用父类(李刚)中的方法,因为我们把它看做了父类。如果我们想知道李启铭有多二,或是想看看他是怎么敢撞人的,我们就需要强制转换cc为 李启铭类。来访问那些方法。

赞(0)
未经允许不得转载:爱上极客 » 面向过程、面向对象、基于对象和继承、派生、多态分别的区别
分享到: 更多 (0)

评论 2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    所以编程语言里最基础的东西

    网络兼职5年前 (2014-12-17)回复
    • 是的,切勿着急,从基础做起!

      yan5年前 (2014-12-17)回复