OOP面向对象
一:什么是面向过程
- Console.WriteLine("手机开机");
- Console.WriteLine("手机联网");
- Console.WriteLine("手机打开游戏");
- Console.WriteLine("手机玩游戏");
- Console.WriteLine("手机结束游戏");
但是突然出现,不同的手机,不同的玩法,不同的游戏,那么又要重新写类似的东西,所以面向过程虽然更更符合人的思考方式,但是及其不方便扩展管理,不能够重复使用,尤其是项目复杂的情况下,会使编程不好维护
- public class Player
- {
- public int Id { set; get; }
- public string Name { set; get; }
- public void PlayIPhone(IPhone phone)
- {
- Console.WriteLine($"{phone.GetType().Name}");
- }
- }
- public class Game
- {
- public void Start()
- {
- Console.WriteLine($"{this.GetType().Name}开始游戏");
- }
- public void Play()
- {
- Console.WriteLine($"{this.GetType().Name}玩游戏");
- }
- public void Over()
- {
- Console.WriteLine($"{this.GetType().Name}结束游戏");
- }
- }
- public class IPhone
- {
- public int Id { set; get; }
- public string Name { set; get; }
- public string Branch { set; get; }
- public void PlayGame()
- {
- Game game = new Game();
- game.Start();
- game.Play();
- game.Over();
- }
- public void Open()
- {
- }
- public void Close()
- {
- }
- }
我们按照对象划分,就是所谓的万物皆对象,然后我们把对象定义好,然后对象封装好,然后把对象的属性和动作都归结为一起,这就是所谓的画格子,每个格子自成体系,内部任意改动不会影响到别人,然后每个格子之间相互交互!虽然我们使思路更加复杂化,但是以后极其容易扩展。
三:面向对象的好处【封装,继承,多态】
1:【封装】的好处
A:最主要的好处是:隔离,即是外部不用关心内部怎么实现,只要接口不变,内部可以随意扩展
B: 安全 private protect等数据结构,只能通过公开的方法来访问,而不能随意修改以致于保证数据的安全
C: 降低耦合,提高重要性,尽量隐藏更多的东西
2:继承的好处:就是为了方便代码重用,通过继承然后子类拥有父类的一切属性和行为,但是只能单继承 ;重载(参数不一致,跟返回值没有关系)
3:多态:意味着有多重形式。在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
4:多态的表现方式分为以下几种:
A: 多态性可以是静态的或动态的。在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。
B:接口多态
C:继承多态
下面的代码能够体现出来继承封装多态
- public abstract class ParentClass
- {
- public ParentClass(int id)
- {
- Console.WriteLine("父类的构造函数");
- }
- public ParentClass()
- {
- Console.WriteLine("父类的构造函数");
- }
- public void CommonMethod()
- {
- }
- public virtual void VirturalMethod()
- {
- }
- public virtual void VirturalMethod(int id)
- {
- Console.WriteLine("子类的带参");
- }
- public abstract void AbstractMethod();
- }
- public class ChildClass : ParentClass
- {
- /// <summary>
- /// 实例化子类的时候,是先完成父类的实例化
- /// </summary>
- public ChildClass() : base()
- {
- Console.WriteLine("子类的构造函数");
- }
- /// <summary>
- /// new 隐藏方法,new 加不加一样的效果
- /// </summary>
- public new void CommonMethod()
- {
- Console.WriteLine("子类的普通方法");
- }
- public sealed override void AbstractMethod()
- {
- Console.WriteLine("子类抽象方法");
- }
- public override void VirturalMethod()
- {
- base.VirturalMethod(); //调用的父类的方法
- }
- }
- public class GrandClass : ChildClass
- {
- /// <summary>
- /// 可以重复覆写,如果不喜欢被重写,可以添加一个sealed
- /// </summary>
- //public override void AbstractMethod()
- //{
- // throw new NotImplementedException();
- //}
- public override void VirturalMethod()
- {
- base.VirturalMethod(); //调用的父类的方法
- }
- }
然后再调用的时候会出现以下结果
- {
- ParentClass instance = new ChildClass();
- instance.CommonMethod(); //调用的父类的方法 普通方法由编译时决定-能够提高效率(由声明时决定)
- instance.VirturalMethod(); //调用的子类方法 虚方法由运行时决定的-多态灵活 (虚方法既可以覆写,也可以不覆写)
- instance.AbstractMethod(); //调用的子类的方法
- }
四:说一下抽象类和接口的区别
1、抽象类和接口都不能直接实例化。如要实例化,涉及到多态。抽象类要实例化,抽象类定义的变量必须指向一个子类变量,这个子类继承并实现了抽象类所有的抽象方法。接口要实例化,接口定义的变量必须指向一个子类变量,这个子类继承并实现了接口所有方法。
2、抽象要被子类继承,接口要被子类实现。
3、接口里只能对方法进行声明,抽象类里既可以对方法进行声明,又可以实现。
4、抽象类里面的抽象方法必须被子类实现,如果子类不能全部实现,子类必须也是抽象类。接口里面的方法必须被子类实现,如果子类不能全部实现,子类必须是抽象类。
5、接口里面的方法不能有具体的实现,这说明接口是设计的结果,而抽象类是重构的结果。
6、抽象类里面可以没有抽象方法,如果一个类里面有抽象方法,那么这个类一定是抽象类。
7、抽象类中的抽象方法都要被实现,所以抽象方法不能是静态的static,也不能是私有的private。
8、接口可以继承接口,甚至可以继承多个接口;类可以实现多个接口,只能继承一个类。
9、抽象类主要用来抽象类别,接口主要用来抽象方法功能。关注事物的本质,用抽象类;关注一种操作,用接口。
10、接口可以定义以下内容
- public interface IExtend
- {
- /// <summary>
- /// 属性可以,字段不行
- /// </summary>
- int Tag { set; get; }
- /// <summary>
- /// 方法
- /// </summary>
- void Play();
- //string Remark = null; //不能声明
- //class Test { } //不能声明
- //Delegate void NoAction(); //不能声明
- /// <summary>
- /// 索引器
- /// </summary>
- /// <param name="i"></param>
- /// <returns></returns>
- int this[int i]
- {
- get;
- }
- /// <summary>
- /// 事件
- /// </summary>
- event Action DoNothindHandler;
- }
四:如何选择抽象类和接口的区别
1:抽象类必须是一个父类,然后再方法不同的时候使用抽象实现,主要是为了代码重用 is a,所以抽象类可以说成是父类+约束,而且是单继承
2:接口:仅仅是为了约束,告诉实现者一定要有某个功能 can do
所以如果需要约束,一般选择接口,因为接口可以多实现并且多继承,除非项目中有代码需要重用,这样可以选择抽象类
但是目前的大部分项目会选择基类和接口联合使用,比如有通用的属性等使用基类来创建,如果需要约束功能的话一般使用接口来约束,所以接口和抽象类可以相辅相成!
OOP面向对象的更多相关文章
- OOP面向对象三大特点
OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值, ...
- OOP 面向对象 七大原则 (二)
OOP 面向对象 七大原则 (二) 上一篇写到了前四个原则,这一篇继续~~ 接口隔离:客户端不应该依赖它不需要的接口:一个类对另一个类的依赖应该建立在最小的接口上. 又是一句大白话~就是说接口尽量 ...
- OOP 面向对象 七大原则 (一)
OOP 面向对象 七大原则 (一) 大家众所周知,面向对象有三大特征继承封装多态的同时,还具有这七大原则,三大特征上一篇已经详细说明,这一篇就为大家详解一下七大原则: 单一职责原则,开闭原则,里氏 ...
- OOP面向对象 三大特征 继承封装多态
OOP面向对象 ----三大特征 继承封装多态 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构 ...
- 用C实现OOP面向对象编程(1)
如摘要所说,C语言不支持OOP(面向对象的编程).并这不意味着我们就不能对C进行面向对象的开发,只是过程要复杂许多.原来以C++的许多工作,在C语言中需我们手动去完成. 博主将与大家一起研究一下如下用 ...
- OOP面向对象程序设计原则
OOP面向对象程序设计原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭 里氏代换原则(Liskov Substitution Principle) 继承必须确保超累所 ...
- Java实现OOP(面向对象编程)
一.对象的综述 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显 ...
- OOP 面向对象的理解
概念 面向对象编程(OOP)是一种编程语言模型,围绕对象是行为.数据.逻辑. 从历史上看,程序被视为一种逻辑程序,它接收输入数据,处理数据并生成输出数据. 基础 面向对象的3大核心思想:封装.继承.多 ...
- PHP中oop面向对象基础知识(一)
OOP 基础知识汇总(一) &g ...
随机推荐
- BAT:文件中替换字符(保留空格和换行)
@echo off rem CMD:"color --help" :: setting color:back white,content blue color f9 ::old s ...
- python set所用后列表不改变里面内容排序
my_list = [1,2,1,54,5,64,4681,4,676] my_list_two = list(set(my_list)) my_list_two.sort(key = my_list ...
- Django学习(一)连接mysql
python3.6 Django2.0 几个改动的点: 1)setting: 2)__init__.py import pymysql 然后再重启server python manage.py run ...
- node平台的安装与搭建
1.node.js 官网:https://nodejs.org/ (.org:是非盈利机构,他们的软件是不收费的,但是服务收费) 安装完以后的检测指令:node -v (在这里安装需要注意一 ...
- 《Java性能调优》学习笔记(1)
性能的参考指标 执行时间 -- 从代码开始运行到结束的时间 CPU时间 -- 函数或者线程占用CPU的时间 内存分配 -- 程序在运行时占用内存的情况 磁盘吞吐量 -- 描述IO的使用情况 网络吞吐量 ...
- QEMU KVM libvirt手册(2): monitor
Administrating Virtual Machines with QEMU Monitor When QEMU is running, a monitor console is provide ...
- 小白必读:闲话HTTP短连接中的Session和Token
本文引用了刘欣的文章,感谢原作者的分享. 1.引言 Http协议在现今主流的IM系统中拥有无可替代的重要性(在IM系统中用HTTP发起的连接被大家简称为http短连接),但Http作为传统互联网信息交 ...
- phpspreadsheet导出数据到Excel
之前我们使用PHP导出Excel数据时使用的是PHPExcel库,但是phpoffice已经官方宣布PHPExcel已经被废弃不在维护,推荐使用phpspreadsheet,如下图所示 我们可以通过c ...
- [Postman]Cookies(12)
Postman的本机应用程序提供 MANAGE COOKIES 模式,允许您编辑与每个域关联的Cookie. 前往cookie经理 要打开MANAGE COOKIES模式,请单击“ 发送”按钮下的 ...
- [Postman]Postman导航(3)
Postman提供了一个多窗口和多标签界面,供您使用API. 此界面设计为您提供尽可能多的API空间. 侧边栏 邮差侧边栏可让您查找和管理请求和集合.侧边栏有两个主要选项卡: 历史记录 和 ...