背景

可能还未上计算机课,有同学就听过面向对象这个词。然而老师课堂上讲过之后,貌似当时听明白了,但真做系统开发时大脑一片空白。甚至很多已经工作几年的程序员依然对面向对象这个事糊里糊涂。面向对象思想非常基础,甚至可以说如果不理解面向对象,那你就没有掌握编程密码。我想通过以下几个方面,让你理解面向对象。

面向对象分析

  1. 面向过程到面向对象
  2. 面向对象思想模型
  3. 模拟对象

面向过程到面向对象

说来话长,面向对象其实是从面向过程发展而来的。为什么这么说呢?大家都知道,是先有的C语言,然后C++语言,最后才是Java语言。没错,这三个语言真就是按照这个顺序发展的,而且后面的语言是站在前面语言的基础上进行调优发展变得更高级。C语言本身就设定了一些数据类型,比如基本数据类型,就是咱常说的int、char、数组等,又有自定义数据类型,顾名思义结构自己定义,看一段C语言例子。

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <string.h>

// 定义学生结构体
struct Student {
    int number;
    float score;
};

上面定义了学生这么个结构,你看这个时候C里面还管这个叫结构,有两个属性,number和score。假设你现在想对student进行一下操作,比如你想把1学号的学生成绩录入系统,C里面的怎么做?需要先弄一个函数出来,还的先声明,再写函数实现,类似这样。

1
2
3
4
5
6
7
8
9
// 函数声明
void inputStudentData(struct Student *s);
// 输入学生数据
void inputStudentData(struct Student *s) {
    printf("请输入学生学号: ");
    scanf("%s", s->number);
    printf("请输入学生成绩: ");
    scanf("%f", &s->score);
}

接着在main函数里面,按照你想的顺进行执行,类似这样。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
int main() {
    int n;
    // 输入学生人数
    printf("请输入学生人数: ");
    scanf("%d", &n);

    struct Student students[n];
    // 输入每个学生的数据
    for(int i = 0; i < n; i++) {
        printf("\n输入第%d个学生的信息:\n", i + 1);
        inputStudentData(&students[i]);
    }
}

这就把学生的信息保持起来了,后面你可能还想打印学生信息等等,这就得声明一个打印函数,然后再实现这个函数。这会你发现没有,C语言是怎样干活的?结构是结构、函数是函数,分开的,然后main里面根据你想的顺序一步一步干活的。这个时候C++现身了,C++说你的自定义结构、函数是分开的,看着多乱?于是乎C++说,我把他们合起来,都放一块,起个名字叫类,像这样。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Student {
private:
    int number;
    float score;

public:
    // 构造函数
    Student(int number, float score) {
        this->number = namnumbere;
        this->score = score;
    }

    // Getter和Setter方法
    int getNumber() {
        return number;
    }

    void setNumber(int number) {
        this->number = number;
    }

    float getScore() {
        return score;
    }

    void setScore(float score) {
        this->score = score;
    }
}

管理学生类

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class StudentManager {
private:
    vector<Student> students;

public:
    // 添加学生
    void addStudent(Student student) {
        students.push_back(student);
    }

    // 计算平均成绩
    float calculateAverageScore() {
        float sum = 0;
        for (Student student : students) {
            sum += student.getScore();
        }
        return sum / students.size();
    }
};

然后在main中对stuent进行操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int main() {
    StudentManager manager;
    int n;

    // 输入学生人数
    cout << "请输入学生人数: ";
    cin >> n;

    // 输入每个学生的数据
    for (int i = 0; i < n; i++) {
        int number;
        float score;
        cout << "\n输入第" << (i + 1) << "个学生的信息:" << endl;
        cout << "请输入学生学号: ";
        cin >> number;
        cout << "请输入学生成绩: ";
        cin >> score;

        Student student(number, score);
        manager.addStudent(student);
    }

    // 计算并打印平均成绩
    float average = manager.calculateAverageScore();
    cout << "\n学生的平均成绩: " << average << endl;

    return 0;
}

到这,你发现有点不一样了,C++把属性和函数都放到类里面了,方法不再杂乱无章了,用的时候通过实例去调用了。就这么整合一下就牛逼了,没发现啥好处啊?不然不然,这个所谓的整合就是封装,同时还为继承、多态打下基础。C的时候都不在一块你咋继承,现在不一样了,只要你再定义一个类继承前面那个整合,就能把前面整合的内容继承下来,你现在的类就不用再写整合里面的东西了,因为继承后已经有了,省事不?还有多态,咋回事呢?比如小鸟会叫,鸭子也会叫,都是叫,但声音不同,对吧,C的时候,谁叫你就调用谁的方法,main里面你的写两处,但有类之后,就能完成统一,在main里面统一使用接口类型,叫 接收叫 = (传入鸟叫或传入鸭子叫),你传入哪个叫,就能表现出那个叫,这就是多态。而Java又是借鉴了C++,优化了内存自动释放等,但核心思想基本与C++相同。

面向对象思想模型

你可能也听到这句话:”一切皆对象“,没错,在面向对象的世界中,一切皆对象。面向对象的世界,其实就是现实世界,不信你看你周围的一切,你眼睛所见到的每个物体都为对象。现在我们把现实世界与面向对象世界联系起来。假如你叫张三,是一名程序员,自然你周围的同事也是程序员,还有项目经理,领导,以及大家手里开发的系统等。那么我们就以为张三为中心,进行系统设计。首先张三与同事、领导、项目经理之间需要交流,自然就要赋予张三交流的能力,张三是程序员自然有写代码的能力,同时也要进行需求分析,自然也有需求分析的能力。到这里,我们就可以简单来设计张三这个类。

 classDiagram
    公司 ..< 制度
    公司 ..< 架构
    公司 ..< 人
    人 <|-- 张三
    人 <|-- 领导
    人 <|-- 项目经理
    人 "1"*-->"2" 胳膊
    项目组"1"o-->"n"项目经理
    项目经理..|>项目计划
    领导"1"-->"1"行政
    公司: + 公司名称
    公司: + 地址
    公司: +业务(String 科技,String 金融)
    公司: +现金流(String 存款)
    公司: +投资(String 现金流)
    项目计划: +项目计划书()
    class 人{
        +生日
        +进食()
        +劳动()
    }
    class 张三{
        -学历
        -交流()
        -需求分析()
        -写代码()
    }
    class 领导{
        +领导气质
        +开会()
        +分批任务()
    }
    class 项目经理{
        +级别
        +立项()
        +项目调研()
    }

上面就可以理解为一个系统,里面有各种人,都是通过人这个类产生出来的,多么像现实社会,所以系统里面跑的都是人的实例,人与人之间产生各种联系,就形成了逻辑。如果把类理解为模版,当你放入张三就产生张三,放入李四就产生李四,这就是面向对象思想的本质。

模拟对象

以一本书来举例子,通过上面的学习,是不是就明白这句话的含义了。书,是不是就是类?没错,是的。只不过,书有很多种,比如科技书籍、文学书籍、小说等等,但都逃不过书这个类。同时他们又有一些共性,比如书名、出版商、价格等,还是通过UML来模拟一下。

 classDiagram
    书: + 名称
    书: + 出版商
    书 <|-- 科技书籍
    书 <|-- 文学书籍
    书 <|-- 小说书籍
    class 科技书籍 {
        + 科技领域
        +科技知识()
    }
    
    class 文学书籍 {
        + 文学体裁
        +文学知识()
    }

    class 小说书籍 {
        + 小说体裁
        +小说知识()
    }

书就是类,不同类别书籍继承了书这个类,又得到了新类,如果落实到具体哪本书,就是实例,是通过类new出来的。

总结

面向对象思想,将以前过程中用到的自定义结构体、函数等整合在一起,定义为类,再通过类这个模版就能产生无数个实例,不同类实例与实例之间、同类实例与实例之间进行交织,就产生了逻辑联系,如果再赋予业务逻辑,那么自然一个业务系统就通过面向对象思维方式设计出来了。当然一个庞大的系统还有其他框架等等,但单纯从面向对象角度,理解面向对象思维就是你能否设计出系统的关键因素。文章阐述了从过程到面向对象的由来,及具体分析了面向对象思想模型,希望对你有所帮助。