面向对象的三大特性(封装,继承,多态)大多少人都应该知道。前两个的话比较容易理解。本文主要说一下面向对象中的多态。

什么是多态?
不同的对象对同一操作,产生不同的执行结果。这就是多态。那么多态又包含了:重载,重写,虚方法,抽象方法。

1,重载
什么叫重载?
在同一个作用域的两个或多个方法函数名相同,参数列表不同的方法叫做重载。重载有三个特点:
1.1:方法名必须相同。
1.2:参数列表必须不同。
1.3:返回值类型可以不相同。

列如:

 public void Animal()
{
Console.WriteLine("睡觉");
}
public void Animal(int time)
{
Console.WriteLine("{0}点睡觉", time);
}

2,重写
什么是重写?子类中为满足自己的需求需要来重复定义基类中的某个方法的不同实现。重写需要使用override关键词。需要重写基类中的方法必须是虚方法或抽象方法。重写的特点:
2.1:相同的方法名。
2.2:相同的参数列表。
2.3:相同的返回值。

3,虚方法
什么是虚方法?
基类中定义的允许在子类中重写的方法叫虚方法。使用virtual关键字定义。子类可以不重写虚方法。列如:

 class Animal
{
public virtual void EatFood()
{
Console.WriteLine("吃东西");
}
}

虚方法可以被直接调用,如:

 Animal a = new Animal();
a.EatFood();

输出的是:

吃东西

虚方法被子类重写,如:

 class Bird:Animal
{
public override void EatFood()
{
Console.WriteLine("鸟吃虫子");
}
}

4,抽象方法
什么是抽象方法?
在基类中定义的并且必须在子类中重写的方法叫抽象方法。使用abstract关键字定义。注意:抽象方法只能在抽象类中定义。

虚方法与抽象方法的区别:因为抽象类无法被实例化,抽象方法无法被调用,也就是说抽象方法永远不可能被实现。

应用场景:
其实多态理解起来并不是很困难。主要是怎么灵活运用到实际开发中。那么现在我举个例子:一个大型工厂,目前可以生产苹果,华为,oppo手机,每个手机所使用的芯片都是一样的,屏幕主板不一样,华为手机有红外线。你会怎么实现呢?

 public abstract class Phone
{
//手机芯片
public string Chip { get; set; } = "chip"; //手机屏幕
public string Screen { get; set; } //主板
public string Mainboard { get; set; } //生产手机方法
public abstract string Production();
} //苹果手机
public class Iphone: Phone
{
public override string Production()
{
Console.WriteLine("开始生产苹果手机");
return Chip + Screen + Mainboard;
}
} //OPPO
public class OppOphone: Phone
{
public override string Production()
{
Console.WriteLine("开始生产OPPO手机");
return Chip + Screen + Mainboard;
}
} //华为
public class HuaweiPhone: Phone
{
//华为手机有红外线
public string InfraredRay { get; set; } public override string Production()
{
Console.WriteLine("开始生产华为手机");
return Chip + Screen + Mainboard + InfraredRay;
}
}

那么现在要生产苹果和华为手机:

         static void Main(string[] args)
{
//生产苹果手机
Iphone iphone = new Iphone() { Screen = "苹果屏幕", Mainboard = "苹果主板" };
Console.WriteLine(iphone.Production()); //生产华为手机
HuaweiPhone huawei = new HuaweiPhone() { Screen = "华为屏幕", Mainboard = "华为主板", InfraredRay = "红外线" };
Console.WriteLine(huawei.Production());
Console.ReadKey();
}

执行输出结果:

开始生产苹果手机
chip苹果屏幕苹果主板
开始生产华为手机
chip华为屏幕华为主板红外线

我们可以看到 iphone 对象和 huawei 对象都执行了同一个方法 Production 产生了不同的结果。还记得多态的定义吗?不同的对象对同一操作产生不同的执行结果。没错,这就是多态。多态的作用:把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

本篇文章就结束啦,如有错误的地方还望大神指点。

原文来自:C#面向对象-多态-曾亚平个人原创博客

C#面向对象-多态的更多相关文章

  1. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  2. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

  3. 李洪强iOS开发之OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. ...

  4. 【基础】Equal方法、面向对象-多态-继承-封装

    package Test; public class L3_1 { public static void main(String[] args) { C c1=new C(100); C c2=new ...

  5. Python之面向对象多态

    Python之面向对象多态 多态与多态性: 多态: 多态是指一类事物有多种形态,一个抽象类有多个子类,因而多态的概念依赖于继承. 1.序列类型有多种形态:字符串.列表.元组. 2.动物有多种形态:Pe ...

  6. Java面向对象多态

    Java面向对象多态 7.2对象 7.2.1创建对象 对象是类的实例 类的名称 对象名称 = new 类的名称(); 7.3继承 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域 ...

  7. JAVA面向对象-多态的理解

    面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...

  8. OC面向对象多态笔记

    面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: int main() { //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 Anima ...

  9. linkin大话面向对象--多态

    java引用变量有2个类型,一个是编译时类型,一个是运行时类型: 编译时类型:声明的类型,把它看做是什么东西 运行时类型:真正的类型,实际上指的是什么东西 如果编译时类型和运行时类型不同,就出现多态. ...

随机推荐

  1. 全新一代云服务器S6,重新定义性价比

    S6通用计算型云服务器,搭载全新一代处理器,配套华为自研高性能智能网卡,计算与网络性能全面升级.S6进一步强化高性价比定位,满足企业性能要求的同时,降低中小企业上云成本. 更多详情请访问ECS产品介绍 ...

  2. plsql判断和循环

    if语句 语法1 如果条件成立,执行if和end if 之间的语句. if 条件表达式 then plsql语句; end if; 语法2 if 条件表达式 then 条件成立时执行的语句; else ...

  3. 整合多个maven工程时Spring配置加载JDBC问题

    问题叙述: 两个工程都通过JDBC访问mysql数据库,各自运行OK, 但合并成一个maven工程后,发现前一个工程访问数据库异常,貌似拿不到自己的DAO. 解决办法: 发现这两个工程的xml配置中, ...

  4. ThinkPHP的视图和模板

    简单来说一个控制器对应一个视图,一个方法对应一个模板下面我们直接上图. 二.给模板赋值 给模板赋值在这里用到了assign()这个函数,assign()函数第一个参数为给这个值自定义名称,第二个参数则 ...

  5. 2.4G芯片SI24R1可替代NRF24L01P

    随着美金和原厂对价格的调控,NRF24L01P的价格越来越高,对终端制造的客户造成了不少的压力成本,但很多人又不原意花费更多的人力物力去重新改版. 小编今天就着重给大家介绍一款芯片,可以在不改板的情况 ...

  6. Xcode中.a文件引起的错误

    一.     TARGETS -> Build Settings-> Search Paths下 1.  Library Search Paths 删除不存在的路径,保留.a文件的路径(此 ...

  7. Ubuntu 18.04 环境下 kubernetes v1.16.2 单机部署说明

    一.安装环境 本次部署使用阿里云ECS 操作系统: Ubuntu  18.04 64位 实例规格: ecs.c6.large 2U4G 二.kubernetes 版本 k8s.gcr.io/kube- ...

  8. Ubuntu18.04安装openCV4.1.2

    Ubuntu18.04下安装openCV4.1.2 注意: 在整个安装过程中,包括后期QT的使用中不要出现中文路径.会很坑的. 一.下载openCV4.1.2 可以再官网进行下载https://ope ...

  9. Balls in the Boxes

    Description Mr. Mindless has many balls and many boxes,he wants to put all the balls into some of th ...

  10. Ganglia与Centreon整合构建智能化监控报警平台

    一.智能运维监控报警平台的组成 随着大数据时代的来临,运维工作的难度越来越大,每个运维人员都要面临不计其数的服务器和海量的数据,如何保证众多服务器和业务系统稳定高效地运行并尽量减少死机时间,成为考核运 ...