面向对象(一):面向对象的基础概念

面向对象是从事程序开发必不可少的一个话题,但什么是面向对象却不是每一个从业者都能充分的理解,大多数都是用着面向对象编程语言,书写着面向过程的脚本。

首先确定一个统一的认知:面向对象语言并不等价于面向对象编程

面向对象语言:

语言本身支持支持封装,继承,多态等编程特征的语言

面向对象编程:

这是一种思维方式,使用C语言依旧可以完成一个面向对象逻辑的实现,同理,使用C#、JAVA等面向对象的语言,也可以完成一个面向过程逻辑的实现

一、面向对象和面向过程

这二者都不是针对编程语言来讲的,是思维方式。

面向过程:数据结构+算法

面向过程指的是我们在解决一个问题或者要完成一个事项的过程中,所有的步骤都依次执行,直到结束,例如手机流水线,要先安装好主板,再安装CPU等零件,再安装屏幕,再到检测,再到装盒,最后塑封(过程可能有遗漏,重点是讲述这个模式)。每一个步骤都需要等待上一个步骤完成之后才可以继续,依赖关系很紧,这种就叫做面向过程

面向对象:对象+交互

面向对象指的是同样是解决一个问题或完成一个事项,只需要一个简单的操作(引用)就可以完成,例如开空调,只需要按下遥控器开启按键,空调就开始了运行,我们不需要知道空调的运行原理,只是触发了一个开关,就完成这个任务,依赖关系没有那么紧,这种就叫做面向对象。

面向过程和面向对象的本质区别在于关注点和复杂度。

面向过程中的每一个步骤都会成为我们的关注点,关注点多了,复杂度就高,而面向对象的关注点很少,复杂度就很低。

直观点就是面向过程是针对一种问题或事项,换了一个相似的事情,还是得做很多的改动才能完成,但面向对象即便换了一个相似问题,只需要把相似问题的特征完成,就可以很轻松的打成目的。

所以面向对象会更容易更方便的完成拓展和移植,复用度和通用性会比较高。

总结一句话:面向过程是高耦合,低内聚,面向对象时低耦合,高内聚

二、理解面向对象基础概念

面向对象领域中的基本元素:类,对象,抽象,接口,抽象类,封装,继承,多态

1) 类

“物以类聚”这个词能很好的诠释类是什么。花、草、树统称为植物,马、牛、羊统称为动物,这里的植物和动物就是类,可以得出:类就是一组相似事物的统称。

相似在生活中是指某些东西有一样的特征和行为,在程序中也是,可以通过相似功能或属性,提炼出类,属性是名词,是特征,功能(方法)是动词,是行为。

安卓手机和苹果手机,都有形状,颜色,价格等属性,都有打电话等功能,提炼出这些特征和行为之后,转成代码就是:

public class Phone
{
    private string _color;
    private string _price;
    private string _shape;

    public void CallUp()
    {
        //Do Something
    }
}

这里有一个问题,具备形状,颜色,价格,打电话等特征的不仅仅是有手机,智能手表等设备也有这些特征,这么看,提炼出一个Phone类是不是就不恰当了。这是肯定的,所以引发一个问题:

如何提炼/定义类? 提炼出什么类取决于观察角度是什么,角度决定看法。当我看手机时,安卓手机和苹果手机就是一类,当我看智能设备时,安卓手机、苹果手机、智能手表就是一类。在某个角度,观察到的所有具有相似特征的事物就是一类。

定义类之后,要抽取特征,程序要遵循属性抽取到不可再分,方法要保持功能单一

比如地址是一个属性,一般都会写xx省xx市xx区xx街道xx小区,这个属性可以直接写一个Address声明出来,但当别的省份邮寄这个快递时,只会用到xx省这个信息,然后发往xx省,之后才会依次获取信息直到送到目的地,仅仅通过一个Address会有大量信息被暴露出去,所以,要抽取成 省,市,区,街道,小区 5个不同的属性让外界按需访问。

方法如果包含的行为太多,会出现一个有大量判读和逻辑且巨大巨长的方法,比如,打球,这个行为包含的内容就太多了,打篮球,打乒乓球,打羽毛球,都是打球,所以要分别实现具体的行为,拆分为多个方法实现。

2)对象

对象是基于类的基础上,产生的具体实例或实际物体

手机是类,一加9是对象,华为Mate40是对象。

3)抽象

抽象是“抽取出比较像的部分”,是从众多事物中抽取出共同的、本质性的特征。

从一组对象中抽取出类,这个过程就是抽象。

抽象的意义在于隔离关注点,降低复杂度

对象的关系是通过抽象建立的,如果从特征看,某个对象和某类没有联系,那么这个类就不可能实现出这个对象,这种对象和类只会存在交互关系(引用)。

编程领域中的软件类并不是凭空捏造出来的,是依托于现实类所拟化出来的,但在编程领域中,往往会额外多出一些在现实类中并不会出现的辅助类,所以,编程领域的软件类是基于现实类产生且会高于现实类。

现实类、现实对象、软件类、软件对象、之间的关系是 

从现实对象中,通过抽象思维,抽取出现实类,拟化为软件类,实现软件对象。


从这里开始,要理解的就很贴近编程的知识了。 

4)接口

接口是一个侧重于交互性质的,与交互相关的,声明(定义)的集合。

不同于类,在面向对象中,类的方法主要用于处理自身的逻辑和功能。接口主要侧重在交互,且不具备实现,仅仅是有方法声明的一个集合。当某几个类有相同的功能时,外界想要调用这个功能,需要对不同的类做各自的调用逻辑,但通过接口就可以使用一个通用的方法,去实现对所有拥有这个功能的不同的类的调用。

例如:不同品牌的鼠标,都有插入USB进行与电脑链接的方法,而电脑上的USB接口就具备一个接口的特征,不需要针对不同品牌做不同的USB接口,只需要通过一个通用的方形USB接口就可以作到对不同品牌,甚至有线,无线等鼠标对象的功能调用。

同样,接口内会包含很多方法声明,USB口会对这些方法都做声明但不一定每一个对象都会实现所有的方法,有的鼠标有侧键,有的没有,但是这并不影响这个USB接口对鼠标对象功能的调用,当这个鼠标对象扩展了侧键功能,这个USB接口依旧支持。

可以说,接口不会因为某个类或某个对象而产生,只会在不同的类/对象,出现需要交互的、相同的方法时,才会产生。

5)抽象类

抽象类实际是在类的基础上,又抽象出的类,高于普通类,像生物中的分类:纲、目、科、属、种

种本身就是一组相似事物的统称,在种的基础上再次进行抽象,抽取出相似特征,形成属,以此类推。当然,属也是一个类,但严格来说,例如“人属”,只会具备比“人种”更泛的特征,并且通过"人属",无法实现出一个具体的对象,那么这样的类就叫做抽象类。

抽象类的意义在于可以在范围更大的区间,去对不同类做交互。


这里开始就是面向对象的三大特性了。

6)封装

封装,字面意思就是把某些东西封起来,装成一个整体。封是保护隐私,装是打组,整合。在面向对象领域,封装很重要,当书写一个类就是一个封装,既然是封装,就需要做到保护隐私,打组整合这2个要点,外界需要访问时,不可以直接获取这个类中的属性和方法,都需要先通过这个类本身,才可以访问到想要的数据,同理,方法也是。

封装之后,这个类/对象要处理的就只是自己本职范围内的事情,如果需要别的支持,就需要和相应的类/对象进行交互,这样一来,每一个封装都把职责划分清晰,复杂度就会降低,关注点也只有自身。

封装的意义:隔离关注点,降低复杂度

7)继承

继承更好的理解方式是遗传,继承在语义上更偏向于从某个地方把东西拿过来,那之前的地方就不再有这个东西,但编程领域中并不是这样,更像是从某个类遗传了一些东西过来,并形成了一个新的类,新类在遗传的基础上还可以有自己的变化。

继承的意义在于,可以保证从某个类中继承实现的对象,都可以保有相同的特征。

8)多态

多态,最好的理解就是继承,从类使用继承的方式实现了一个对象,在传参中,可以直接把参数类型设置为这个类,传参的时候可以传这个对象。也就是,多态实现了通过一个指向父类的指针或者引用,实现对子类对象的调用

public class Parent
{
    public void Speak()
    {
        Debug.Log("parent speak");
    }
}

public class Son:Parent
{
    public void Speak()
    {
        Debug.Log("sonspeak");
    }
}

public class Main()
{
    public void PersonSpeak(Parent parent)
    {
        parent.Speak();
    }

    public void MainFunc()
    {
        PersonSpeak(new Son());
    }
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值