c 子类对象 访问父类对象受保护成员_面向对象编程(OOP)

    这节讲一下,什么是面向对象(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(); }

df1cc4ee0e0e60444d9d6f6acf407e6b.png

    对象化:

//创建三个对象//厨师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();

8855cbf6926bdfbc8e19d99513e1f254.png

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

    封装:

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

54a256185c9a7eba41312085ecd64310.png

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

    本节到此结束...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux数据泵导入command not found_MySQL:数据库结构优化、高可用架构设计、数据库索引优化...

一、SQL查询优化(重要)1.1 获取有性能问题SQL的三种方式通过用户反馈获取存在性能问题的SQL;通过慢查日志获取存在性能问题的SQL;实时获取存在性能问题的SQL;1.1.2 慢查日志分析工具相关配置参数:slow_query_log # 启动停止记录慢…

武汉船舶职业技术学院计算机分数线,武汉船舶职业技术学院录取分数线2021是多少分(附历年录取分数线)...

武汉船舶职业技术学院录取分数线2020是多少分,各专业录取分数线是多少,是每个填报武汉船舶职业技术学院的考生最关注的问题,随着各省高考录取批次相继公布,考生也开始关心是否被录取,本站小编整理相关信息供参考&#…

linux std::queue 怎么释放内存_电脑卡慢怎么办?一个小工具帮你轻松释放内存,瞬间提升电脑性能...

有一种电脑叫“卡巴死机”大家有没有发现,如今的电子产品越来越不耐用了。无论是电脑,还是手机,超过一年以上,就得考虑更换了。1G变2G,2G升4G,按理说电脑应该会更快更好,实际却是相反&#xff0…

2015计算机二级公共基础知识,2015年计算机二级公共基础知识考点测试题(8)

排序技术1[单选题]对长度n的线性表排序,在最坏情况下,比较次数不是n(n一1)/2的排序方法是(  )。参考答案:D参考解析:排序技术有:①交换类排序法(冒泡排序法、快速排序法);②插入类排序法(简单插入排序、希尔排序);③…

2020年周数和日期对应表_2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期...

2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期考试日期类别口试预定 开始日期*报名截止日期准考证 打印日期成绩单 寄送日期*04/01/2020A14/12/201916/12/201925/12/201917/01/202011/01/2020A+G21/12/201923/12/201901/01/202031/01/202016/01/2020…

飞行摇杆设置_HORI皇牌空战7最新飞行摇杆抢先开箱 设计出色布局合理

《皇牌空战7》即将于1月17日发售PS4/Xbox One版,2月1日发售PC版。近日,我们在本作发售之前收到了HORI为《皇牌空战7》量身设计制造的最新一代飞行摇杆。随着《皇牌空战7》即将到来,我们在此为大家做一个简单的先行开箱评测介绍,为…

latex subfigure_latex-图片插入

作为一个新手入门latex写作,在已有的期刊模板下,我认为不需要每个命令都知道它的参数。我们需要做的就是在最短的时间内完成论文,重点在内容上,而不是说我latex用的很棒。这里,我只给出我平时常用的两种作图方式&#…

为什么只有奇次谐波_治理变频器产生谐波的应用

变频器运行对电网所产生的高分量谐波电流极大的影响了电网质量,使同电网中的用电设备不能正常使用。根据相关的政策法规本文阐述了变频器产生谐波电流的几种治理方案优缺点,结合实际案例重点分析了有源滤波器(APF)在治理变频器产生…

1964年诞生的第一代电子计算机,世界第一台电子计算机诞生的年份是?

满意答案sxh1122014.01.21采纳率:57% 等级:12已帮助:8464人.第一台电子计算机阿塔纳索夫-贝瑞计算机(Atanasoff-Berry Computer,简称ABC)是世界上第一台电子计算机,为艾奥瓦州立大学的约翰文森特阿塔纳索夫(John Vi…

jsp项目开发案例_Laravel中使用swoole项目实战开发案例一 (建立swoole和前端通信)

Laravel中使用swoole项目实战开发案例二(后端主动分场景给界面推送消息)工欲善其事,必先利其器。在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率。安装 swoole 拓展包安装 redis 拓展包安装 lar…

android 环形时间显示_使用Arduino构建OLED显示屏与Android手机接口的智能手表

背景知识视频教程Arduino 训练营:通过项目学习​viadean.com通过制作Arduino UNO FM收音机接收器学习Arduino I2C​viadean.com通过构建实际应用程序来掌握Arduino - 国外课栈​viadean.com我们大多数人都熟悉162点阵液晶显示器,它在许多项目中用于向用户…

计算机的安全设置在哪儿,电脑防火墙在哪里设置

随着微软系统的更新,现在的Windows 10系统对于网络防护非常的安全,但是有的朋友电脑需要测试一些软件,就需要关闭电脑的防火墙,但是不懂怎么设置电脑防火墙,不用担心下面就让小编教你电脑防火墙在哪设置吧。下面电脑防…

python的加减乘除运算_python实现四则运算

https://gitee.com/szh123/four_arithmetic_implementation.git 1.需求分析: 实现四则运算题目及答案生成,控制生成题目的个数,题目中数值不超过10且有分数存在并用真分数表示。 可以生成10000道题 运算符不超过3个 题目不能出现重复即不能经…

微众银行软件测试笔试题,微众银行4月8日笔试题目及部分代码

AC,大致思路就是算一下该字符串能组成的最大回文长度,然后按差值奇偶性输出胜利者,本来以为“最优策略”的删除任意一个字符会很复杂,但是试了下就过了。import java.util.Scanner;public class Main {public static void main(St…

水晶底是什么材质_蓝宝石水晶镜面,贵是有道理的!

表友们在选择手表的时候,常常会在意机芯、性能等,但是你第一眼爱上的往往是它的外观。在手表上,有一样部件,你总是最先看到,占据着你视线的C位,但是你却总是忽略它。这个部分就是表镜,这个重要却…

dedecms 漏洞_dedescan一款织梦漏洞扫描器

dedescan是一款可以扫描所有已公开的dedecms漏洞的扫描器。... ... ... ... ... ... …

post获取重定向的链接 python_欧美音乐网站Python爬虫项目实战

爬虫项目实战0x01 目标分析最近发现一个比较好的欧美音乐下载网站,可以下载大部分高质量欧美音乐。该爬虫项目要实现自动化批量获取用户想要下载的音乐。本文从网站分析、爬虫设计、代码实现三个方面出发,系统介绍该爬虫项目。项目完整代码在Github中可以…

中国志愿者服务器注册,如何注册成为志愿者?中国志愿服务网注册流程

西宁市团员、团干、青年志愿者个人和组织网上注册方式为“志愿汇”和“全国志愿服务信息系统(www.chinavolunteer.cn)”两个网站平台双线注册。志愿者注册流程基本操作指引一、PC电脑端操作注:本篇内容较多,建议先“收藏”文章或点击底部“在看”。1、PC…

python s d是什意思_python里d是什么意思

python中的fd()是turtle模块中的一个方法。fd 方法的实参是像素距离。turtle模块:它可以让你使用海龟图形(turtle graphics)绘制图像 turtle模块其中的函数: 1)turtle.pensize():设置线条的粗细&#xff1b…

计算机二级如何接受审阅者修订,操作方法 合并修订文档 步骤1 要求审阅者

工作中,经常需要将文档交予多人同时审阅,那么如何实现让多人同时修改一个文档呢?解决方案审阅者在修订模式下修改文档,再将所有的修订文档合并。操作方法合并修订文档步骤1 要求审阅者,在修订模式下,修改文档&#xf…