专栏首页木可大大面向对象的演进过程
原创

面向对象的演进过程

计算机高级语言可以分为解释型语言(interpreting)和编译型语言(compiling),具体可以参考漫谈计算机编程语言。除了这种分类方式,其实还可以分为面向对象和面向过程,本期我们就来聊聊面向对象的演进过程。

远古时期

我们知道 程序 = 数据结构 + 算法,其中数据结构包括数组、栈、队列、链表、树以及图等,而算法是包含顺序、循环、分支三种逻辑结构的代码,为了使算法能够到处复用,通常将算法封装在函数中。

为了加深大家的理解,我来举个具体的例子--栈,它的定义如下:

typedef struct Stack{
  int elements[10];
  int top;
}Stack;

它的算法即功能,包含入栈、出栈、显示栈顶。

void push(Stack *s,int data);
int pop(Stack *s);
int top(Stack *s);

现在,我们就可以使用push、pup、top来维护Stack,同时,我们可以直接持有Stack,操作Stack内部的elementstop。这样一来可能导致Stack内部数据不好维护。

Object时期

针对这个问题,我们的先辈们想出了一种方法:将数据结构和算法结合起来,形成Object,将数据结构部分变成Object的属性,算法变成Object的行为,并且只能通过访问Object的行为来操作Object的属性,我们不能直接访问Object的属性。

现在我们就可以使用Object创建对象,例如:

object1 {
  int elements[10];
  int top=6;
  void push(int data);
  int pop();
  int top();
}

object2 {
  int elements[10];
  int top=9;
  void push(int data);
  int pop();
  int top();
}

我们发现object1objec2中有很多重复的代码即push()、pop()和top(),我们需要提取这些复用的代码,将它们放到一个地方,即Classobject1object2的方法部分只要指向Class就可以。

由于函数定义只有一份存在Class文件中,但是对应的Object却有很多份。那么,我们在操作pop、push等函数时是如何确定是哪个Object的?这里不得不称赞我们的先辈,他们在每次调用函数的时候,都将调用者自己作为一个隐藏的参数传递过去,其中隐藏的参数用this表示。

继承时期

我们通过Class解决各个Object中的重复代码问题,同理,我们也在Class中发现了代码重复问题。针对这个问题,我们又该如何破解呢?使用继承,也就是说将那些共性的、重复的代码放到父类中去,这样子类就可以直接使用而不用重新写一遍。其中,继承可以分为单继承和多继承。单继承就是使子类拥有一个父类的特征,而多继承指的是子类同时拥有多个父类的特征。虽然多继承可以最大限度的减少重复代码,但是当多个父类中有相同的方法名时,子类就会产生歧义,也就是说子类不知道真正继承哪个父类。因此,Java语言就采用了单继承。一个父类可以有多个子类,而在子类里可以重写父类的方法,这样每个子类里重写的代码是不一样的,这就是多态。为加深大家对这句话的理解,我就以购物车为例。它的代码如下:

public abstract class Product{
  public String getName(){
    return "Product";
  }
  public abstract float getPrice();
}
class TV extends Product{
  public String getName(){
    return "TV";
  }
  public  float getPrice(){
    return 6000.0f;
  };
}
class Food extends Product{
  public String getName(){
    return "Food";
  }
  public  float getPrice(){
    return 100.0f;
  };
}

TVFood这两个类继承于Product,购物车类可以这么写:

public class ShopCart{
  List<Product> items = new ArrayList<Product>();
  public void addProduct(Product p){
    float total = 0.0f;
    for(Product p:items){
      total += p.getPrice();
    }
  }
}

我们发现ShopCart类中持有的是一个抽象概念Product,而不是它的具体实现,即它的两个子类。这符合面向对象设计原则中的针对接口编程,而不是实现编程


欢迎关注微信公众号:木可大大,所有文章都将同步在公众号上。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面向对象的演进过程

    我们知道 程序 = 数据结构 + 算法,其中数据结构包括数组、栈、队列、链表、树以及图等,而算法是包含顺序、循环、分支三种逻辑结构的代码,为了使算法能够到处复用...

    木可大大
  • 面向对象设计必须遵循的几条原则

    我们应该采用何种方法去应对需求变化呢?首先,在方法论层面我们应该采用敏捷开发;其次,在代码层面,使用OOD(Object-Oriented Design,面向对...

    木可大大
  • 漫谈Git和Github

    上期漫谈版本控制系统中我们谈到了版本控制系统的四个演进过程,即悲观锁版本 -> 乐观锁版本 -> 多分支版本 -> 分布式版本,目前我们使用最多的是分布式版本,...

    木可大大
  • 面向对象的演进过程

    我们知道 程序 = 数据结构 + 算法,其中数据结构包括数组、栈、队列、链表、树以及图等,而算法是包含顺序、循环、分支三种逻辑结构的代码,为了使算法能够到处复用...

    木可大大
  • 【CodeForces 504A】Misha and Forest

    有n个点,代号分别为0到n-1,然后第i个点有di个相连点,与i 相连的点的XOR sum 为si,求所有的边。

    饶文津
  • 算法-编程的灵魂--八皇后

    对于我们程序员来说,算法是编程的灵魂,算法的好坏与否,也决定了你代码的健壮性。 ----至此,祝愿各位五一节快乐,玩的开心! 下面,看看下面的经典算法,经典的算...

    赵腰静
  • 【算法】关于图论中的最小生成树(Minimum Spanning Tree)详解

    这里的图当然不是我们日常说的图片或者地图。通常情况下,我们把图看成是一种由“顶点”和“边”组成的抽象网络。在各个“顶点“间可以由”边“连接起来,使两个顶点间相互...

    短短的路走走停停
  • 牛客NOIP提高组R1 C保护(主席树)

    考虑一个点x,什么时候军队对它有贡献,肯定是u或v在他的子树内,且lca在他的子树外

    attack
  • 3555: [Ctsc2014]企鹅QQ

    Description PenguinQQ是中国最大、最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供...

    attack
  • POJ 1741 Tree(树的点分治,入门题)

    Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21357 ...

    Angel_Kitty

扫码关注云+社区

领取腾讯云代金券