这节讲一下,什么是面向对象(Object Oriented Programming)。说面向对象之前,我们不得不提的是面向过程(Process Oriented Programming),C语言就是面向过程的语言,这两者的区别在哪呢?我们可以设想一个情景——厨房做菜:

以面向过程的形式解释来说,第一步:准备材料,第二步:起火,第三步:炒菜,第四步:上菜;面向过程就是编写一个个函数,每个函数执行一部分操作,最后根据这一套函数,执行下来完成一个整体需求为目的。

那面向对象呢,我们同样的解释做菜说,第一步:要有厨师,灶台,要有服务生,第二步:厨师准备材料,第三步:灶台起火,第四步:厨师炒菜,第五步:服务生上菜。面向对象的编程方式,将原本各个独立的函数,用它所属的对象规整了起来,并封装成方法(面向对象中的"函数"有个新的称呼叫方法Method)。虽然实际上代码量会变多,但是这种编程思维是合情合理的,符合实际的,让人更容易理解,因为每个对象的职责是明确的,从而后期维护会变得更方便。

下面在代码层面,演示一下面向对象和面向过程的区别:

过程化:

#include "stdio.h"

void Prepare(){
printf("准备食材。\n");
}
void Fire(){
printf("起火\n");
}
void Cooking(){
printf("炒菜,\n");
printf("炒完了\n");
}
void Serve(){
printf("请享用。");
}

main(){
Prepare();
Fire();
Cooking();
Serve();
}

对象化:

//创建三个对象
//厨师
class Cook
{
//准备食材的方法
public void Prepare()
{
Console.WriteLine("厨师准备食材。");
}
//做饭的方法
public void Cooking()
{
Console.WriteLine("厨师正在做饭...");
Console.WriteLine("厨师做好了。");
}
}
//灶台工具类
static class CookingBench
{
//静态工具方法:起火
public static void Fire()
{
Console.WriteLine("灶台生火。");
}
}
//服务员
class Waiter
{
//上菜方法
public void Serve()
{
Console.WriteLine("请享用。");
}
}

在主方法中调用:

Cook cook=new Cook();
Waiter waiter=new Waiter();

cook.Prepare();
CookingBench.Fire();
cook.Cooking();
waiter.Serve();

面向对象有三大特征:封装,继承,多态。下面详细讲一下:

封装:

    每个人都有自己的秘密,在面向对象的代码中也是如此,对象中,有可以被外界查看的,也有不对外界查看的,这种将一些成员隐藏起来的思想就是封装,实现封装,需要先了解一下四个访问修饰符:public, private, protect, internal

访问修饰符可以修饰类,属性,方法,使用修饰符修饰类或属性、方法,具有不同的访问级别。声明时访问修饰符要写在最前:

public class publicClass{}//声明一个类
private bool isPublic;//声明一个属性

public:公共的,这个访问级别最低。

private:私有的,故名思义,这个访问级别最高,只能在声明的作用域内访问。
    protect:受保护的,只能在继承链上被访问,说白了只有继承了一个类,才能访问这个类中protect修饰的成员。

internal:内部的,只能在同一个程序集中访问。可以狭义的理解为同一个命名空间下可以访问。

还有一个组合拳:protect internal,这就是既要满足同一个程序集,又得是继承的关系才能访问。

通过这几个关键字,我们就可以实现封装。开发的时候只需要明确写的类或者属性,方法等分配什么样的访问权限即可。

继承:

继承的概念,也很容易理解,它就好比现实生活中,孩子继承父母的家产,那么父母的东西就成了孩子的,在C#中,类和类之间实现继承是通过":"来实现的。

public class Father{}
public class Chlid:Father{}//Child类继承了Father

注意,C#是单继承的语言,也就是说一个类只能继承一个父类。

子类可以继承父类中非private的属性或方法,如果private的属性或方法能访问,也就不会有protect这个关键字存在。通过继承,我们可以将子类共有的重复代码抽离到父类中,这样所有的子类就不必声明这些成员,就减少了很多代码量。在C#的继承结构中,object类是所有类的父类,任何一个类都是默认继承object。object类为我们提供了一些类中最最基础的成员,如我们常用的tostring()方法。

面向对象中有个原则叫开闭原则,这个原则规定对修改封闭,对扩展开放,也就是说,当写了一个类并使用了一段时间后,因为项目升级或者其它原因,我们需要修改这个类(添加一些新东西),这时,根据开闭原则,我们就不能直接修改,而是要再写一个类,去继承它,在子类中添加新的业务逻辑,这也是继承的一个用途。

继承中,还有一个概念叫做方法的重写,就是说,子类中有一个方法和继承父类的方法名一样,这样子类方法就把父类方法给覆盖了,这个过程就是重写。这个概念在具体介绍类和方法的小节中会详细展开。

多态:

多态依赖继承,有继承才能实现多态。同一个类,有不同的形态就是多态。比如狗这种动物,有不同的形态:哈士奇,田园犬,柯基等。在代码中的体现就是父类可以接收子类为其赋值。还是拿上面的例子来说,以下代码就是多态例子:

Father f=new Chlid();

    多态性的依据是里氏转换原则:子类继承父类,那么,原来适用于父类的场景,一定适用于子类,因为子类继承了父类的所有显式功能,父类能做的,子类也能做。这一原则就是定义这个理论的存在,子类可以直接替代父类,将父类全部转换为子类,程序的行为没有区别。

多态性也面向对象编程中很重要的基石,我们一般在编程中尽可能地使用接口,面向抽象,降低耦合,因为多态性,我们才能通过接口或一些抽象的数据结构来实现实例的操作。

最后通过一个例子演示一下多态(涉及到类和方法的一些知识会在下节类和方法中详解):

public class Dog
{
public string name { get; set; } public Dog(string name)
{
this.name = name;
} public void introduce()
{
Console.WriteLine("这是一只:" + name);
}
}

public class Husky : Dog
{
//调用父类的构造方法,为name赋值
public Husky():base("Husky"){}
}

public class Koji : Dog
{
public Koji() : base("Koji"){}
}

class DogStore
{
public Dog dog { get; set; }

public DogStore(Dog dog)
{
this.dog = dog;
}

public void wantBuy()
{
Console.WriteLine("Do u want this "+dog.name+"?");
}
}

以上代码中有一个共同的Dog类,分别有两个类哈士奇,柯基继承了它。还有一个宠物狗商店,需要Dog这个属性。

下面看一下主方法中的代码:

DogStore dogStore=new DogStore(new Husky());
dogStore.wantBuy();
dogStore=new DogStore(new Koji());
dogStore.wantBuy();

我们通过父类,接收更加具体的子类,这就是多态性很好的体现,这也是很优雅高效的编程方式。

 个人公众号,热爱分享,知识无价。

面向对象编程OOP的更多相关文章

  1. [JAVA] 面向对象编程OOP Note

    面向对象编程OOP Note OOP五个基本特性1. 万物皆对象.2. 程序是对象的集合,它们通过发送消息来告知彼此所要做的.3. 每个对象都有自己的由其他对象所构成的存储.4. 每个对象都拥有其类型 ...

  2. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  3. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  4. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)

    一.面向对象编程(继承) 这篇博客是面向对象编程的第三篇,JS继承.继承顾名思义,就是获取父辈的各种"财产"(属性和方法). 怎么实现继承? 我们的JavaScript比较特别了, ...

  5. JS--我发现,原来你是这样的JS:面向对象编程OOP[2]--(创建你的那个对象吧)

    一.介绍 我们继续面向对象吧,这次是面向对象编程的第二篇,主要是讲创建对象的模式,希望大家能从博客中学到东西. 时间过得很快,还是不断的学习吧,为了自己的目标. 二.创建对象 1.前面的创建对象方式 ...

  6. 面向过程编程(OPP) 和面向对象编程(OOP)的关系

    面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和 ...

  7. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

  8. 【软件构造】第三章第四节 面向对象编程OOP

    第三章第四节 面向对象编程OOP 本节讲学习ADT的具体实现技术:OOP Outline OOP的基本概念 对象 类 接口 抽象类 OOP的不同特征 封装 继承与重写(override) 多态与重载( ...

  9. 2016/1/17 笔记 1,面向对象编程OOP 2,类 全

    面向对象编程OOP 编程方式的发展 1,面向过程 重用性低 维护工作量大  2,面向对象 重用性高 维护容易 概念 1,对象 Object 一个具体的事物 是类的实例      2,类Class 同一 ...

  10. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

随机推荐

  1. 热门跨平台方案对比:WEEX、React Native、Flutter和PWA

    本文主要对WEEX.React Native.Flutter和PWA几大热门跨平台方案进行简单的介绍和对比.内容选自<WEEX跨平台开发实战> (WEEX项目负责人力荐,从入门到实战,教你 ...

  2. python程序控制结构

    一:顺序结构 顺序结构的程序是指程序中的所有语句都是按照书写顺序逐一执行的,但是顺序结构的程序功能有限. 二:选择结构 选择结构也称为分支结构,用于处理在程序中出现两条或更多执行路径可供选择的情况.选 ...

  3. 菜刀jsp小马

    逛google收获小马一枚,收藏一下 <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*&q ...

  4. Netflix业务运维分析和总结

    目录 Netflix工作环境的分析和思考 为什么Netflix会做得如此极致? 海量业务规模下的技术架构和挑战 更加合理的组织架构和先进的工具体系及理念 自由与责任并存的企业文化 当前问题: 精选提问 ...

  5. 问题笔记 - element表格 操作状态值

    1.必须从传到表里的数据源中取值(scope.row.star)

  6. 2021 小白版,360 行行行转 IT

    hey guys ,我是 cxuan,这一篇文章我就要和你聊聊编程如何学习,这一篇文章涉及的内容简直太多了,我将从入门开始,一步一步到如何提高,然后到一些学习的相关问题,还有一些计算机相关的术语等,干 ...

  7. Scrapy入门到放弃01:开启爬虫2.0时代

    前言 Scrapy is coming!! 在写了七篇爬虫基础文章之后,终于写到心心念念的Scrapy了.Scrapy开启了爬虫2.0的时代,让爬虫以一种崭新的形式呈现在开发者面前. 在18年实习的时 ...

  8. jasypt-spring-boot提示Failed to bind properties

    1 问题描述 在Spring Boot中使用jasypt-spring-boot进行加密,但是提示: Description: Failed to bind properties under 'spr ...

  9. ASP.NET CORE使用WebUploader对大文件分片上传,并通过ASP.NET CORE SignalR实时反馈后台处理进度给前端展示

    本次,我们来实现一个单个大文件上传,并且把后台对上传文件的处理进度通过ASP.NET CORE SignalR反馈给前端展示,比如上传一个大的zip压缩包文件,后台进行解压缩,并且对压缩包中的文件进行 ...

  10. 数据结构之Queue | 让我们一块来学习数据结构

    前面的两篇文章分别介绍了List和Stack,下面让我们一起来学习Queue 数据结构之List | 让我们一块来学习数据结构 数据结构之Stack | 让我们一块来学习数据结构 队列的概况 队列是一 ...