1、定义:指不同的对象收到相同的消息时,会产生不同的行为,同一个类在不同的场合下表现出不同的行为特征。

比如。

 class Program
{
      //下面三各类都继承object,但不同类的tostring()有不同的表现。
static void Main(string[] args)
{
object o = new object();
Console.WriteLine(o.ToString());
Person person = new Person();
Console.WriteLine(person.ToString());
string msg = "你好";
Console.WriteLine(msg.ToString());
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,作出通用的编程,以适应需求的不断变化。

2、实现多态。

虚方法实现方法重写来实现多态。

class Program
{
//希望person存的是哪个类的对象就调用哪个类的方法
//第一步 将父类中对应方法家virtual关键字 变为虚方法(子类可重写)
//子类中方法用override关键字将父类虚方法重写
static void Main(string[] args)
{
Person[] person = new Person[];
person[] = new American();
person[] = new Japan();
person[] = new Chinese();
for (int i = ; i < person.Length; i++)
{
//由于person是Person类的,如果我想让每个人说出他的国籍
//只能判断类型然后强制转换:
//if (person[0]is American)
//{
// ((American)person[0]).Say();
//}
//希望person存的是哪个类的对象就调用哪个类的方法
//第一步 将父类中对应方法家virtual关键字 变为虚方法(子类可重写)
//子类中方法用override关键字将父类虚方法重写
person[i].Say(); //这句话就体现了多态 } }
} public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public virtual void Say()
{
Console.Write("Person");
}
}
public class American:Person
{
public override void Say()
{
Console.WriteLine("美国人");
}
}
public class Japan:Person
{
public override void Say()
{
Console.WriteLine("日本人");
}
}
public class Chinese : Person
{
public override void Say()
{
Console.WriteLine("中国人");
}
}

例子中,把所有子类都当作Person类来对待,屏蔽掉了各个子类的不同成员(.点不出来),其中person[i].Say();就是通用的代码。

通过抽象类实现多态:

 抽象类:1、类前加abstract  2、。。3、抽象成员不能有实现  4、 抽象成员必须包含在抽象类中。 5、抽象类不能用来实例化对象(作用:被继承----实现多态)  6、抽象成员子类继承后必须重写,除非子类也是抽象类。 (就像领导,只告诉员工要做什么)

实现:和上面虚方法类似,利用重写来实现。

抽象类和虚方法选哪个:如果需要实例化或者父类中有默认的实现就选虚方法,否则用抽象类。

例子:

class Program
{
static void Main(string[] args)
{
Pc pc = new Pc();
All udisk = new UDisk();
pc.Device = udisk;
pc.PCRead();
pc.PCWrite(); }
}
public abstract class All
{
public abstract void Read();
public abstract void Write();
}
public class Mp3 : All
{
public override void Read()
{
Console.WriteLine("Mp3读");
} public override void Write()
{
Console.WriteLine("Mp3写");
}
}
public class UDisk : All
{
public override void Read()
{
Console.WriteLine("udisk read");
} public override void Write()
{
Console.WriteLine("udisk write");
}
}
public class Pc
{
public All Device{ get; set; }
public void PCRead()
{
Device.Read();
}
public void PCWrite()
{
Device.Write();
}
}

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

  1. Python_day8_面向对象(多态、成员修饰符、类中特殊方法、对象边缘知识)、异常处理之篇

    一.面向对象之多态 1.多态:简而言子就是多种形态或多种类型 python中不支持多态也用不到多态,多态的概念是应用与java/C#中指定传参的数据类型, java多态传参:必须是传参数的数据类型或传 ...

  2. 黑马程序员_Java面向对象3_多态

    5.面向对象_多态 多态定义:某一种事物存在的多种形态. 例:动物中猫,狗. 猫这个对象对应的类型是猫类型. 猫 x = new 猫(); 同时猫也是动物的一种,也可以把猫称为动物. 动物 y = n ...

  3. Python入门之面向对象的多态和继承

    本章内容 Python面向对象的多态和继承对比 ========================================= 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的 ...

  4. Java面向对象之多态(来源于身边的案例)

    2019年1月3日 星期四 Java面向对象之多态(来源于身边的案例) 1. 为什么要用多态? 1.1 多态是面向对象的三大特性之一 1.2 多态是基于接口设计的模型 1.3 多态具有横向扩展特性 1 ...

  5. go面向对象之多态即接口(interface)

    Go 语言接口 Go 语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现了这些方法就是实现了这个接口. 实例 /* 定义接口 */ type interface ...

  6. Day 20: 面向对象【多态,封装,反射】字符串模块导入/内置attr /包装 /授权

    面向对象,多态: 有时一个对象会有多种表现形式,比如网站页面有个按钮, 这个按钮的设计可以不一样(单选框.多选框.圆角的点击按钮.直角的点击按钮等),尽管长的不一样,但它们都有一个共同调用方式,就是o ...

  7. 「MoreThanJava」Day 6:面向对象进阶——多态

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  8. day26、面向对象进阶:多态、封装、反射

    一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...

  9. Java面向对象的多态

    Java中多态的概念是面向对象中除封装和继承外非常重要的知识点,也是Java面向对象三大特性最后一个特性 多态其实就是指对象存在的多种形态,多态分为引用多态和方法多态 引用多态的含义就是:父类的引用可 ...

  10. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

随机推荐

  1. 用JavaScript制作简单的计算器

    <html > <head> <title>简单计算器</title> <style type="text/css"> ...

  2. python random 模块

    http://blog.csdn.net/m0_38061927/article/details/75335069

  3. 小程序 mpvue自定义底部导航栏

    1.在compontents新建文件放入 <template> <section class="tabBar-wrap"> <article clas ...

  4. CDN随笔

    CDN的理解:(1)CDN (内容分发网络)加速用户获取数据的 系统(2)部署在离用户最近的网络节点上(3)命中CDN 不需要访问后端服务器(4)互联网公司自己搭建或租用

  5. 浅析http缓存

    1.什么是缓存 将服务器上的静态资源,保存在本地,当发送web请求的时候,如果本地有“已缓存”的静态资源,则从使用本地保存的静态资源,而不是从源原服务器再次请求. 2.缓存的优点 缓存减少冗余的数据传 ...

  6. 微信机器人 index

    <?phprequire_once ('src/wechat.php');$wechat = new wechat();$act = isset($_GET['act'])?$_GET['act ...

  7. AbstractRoutingDataSource 实现动态切换数据源

    扩展AbstractRoutingDataSource类 package com.datasource.test.util.database; import org.springframework.j ...

  8. 探秘JS的异步单线程

    对于通常的developer(特别是那些具备并行计算/多线程背景知识的developer)来讲,js的异步处理着实称得上诡异.而这个诡异从结果上讲,是由js的“单线程”这个特性所导致的. 我曾尝试用“ ...

  9. 两张图彻底搞懂MyBatis的Mapper原理!

    作者:肥朝 简单使用 这是一个简单的Mybatis保存对象的例子 1@Test 2public void testSave() throws Exception { 3 //创建sessionFact ...

  10. Java程序员的成长之路

    阅读本文大概需要 8.2 分钟. tips:虽然题目是写的Java程序员,但对其他语言的开发来说也会有借鉴作用. 本篇介绍的是大体思路,以及每个节点所需要学习的书籍内容,如果大家对详细的技术点有需要, ...