1.虚方法提供一种默认实现,子类可以选择是否重写,如果不重写,那么就使用父类已经实现的方法。(重写可以改变方法的指针)

如果需要改变类型指针,那么需要做方法的重写:

1.如果子类方法是重写方法,那么系统会扫描父类方法中,有没有相同签名的可重写方法,如果没有就报错。

2.如果父类方法是虚方法,那么子类可以选择是否重写,如果重写,就会调用子类的重写方法,实现多态;如果没有重写,就会使用父类已经实现的方法。

3.实现多态需要实现方法的重写

3.实现重写得实现类的继承

多态的使用:申明父类变量,实例化子类对象。

多态:一种操作,多种响应。

实现多态的思路:

1.先创建好父类,在创建好子类;

2.在父类中创建需要被重写的虚方法或者抽象方法

3.在子类中重写父类的虚方法或者抽象方法

4.申明父类类型的变量,实例化子类对象---写出通用代码;

1.声明父类变量,实例化子类对象  如:Person per=new Student()

2.以父类作为方法的返回值类型,返回具体的子类对象---(简单工厂,封装变化点);

3,父类作为参数,传入具体的子类对象;

父类People

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的实现
{
class People
{
#region ID
int id; public int ID
{
get { return id; }
set { id = value; }
}
#endregion #region Name
string name; public string Name
{
get { return name; }
set { name = value; }
}
#endregion #region Age
int age; public int Age
{
get
{
//如果年龄大于0小于等于100,就返回,否则返回18岁
if (age > && age <= )
{
return age;
}
else
{
return ;
}
}
set
{
if (value > && value <= ) //注意这里不是: if(age>0&&age<=100)
{
age = value;
}
else
{
age = ;
}
}
}
#endregion #region Sex
string sex; public string Sex
{
get
{
//如果性别是男,或者女,就返回相应值,否则就设置为人妖
if (sex == "男" || sex == "女")
{
return sex;
}
else
{
return "人妖";
}
}
set
{
if (value == "男" || value == "女")
{
sex = value;
}
else
{
sex = "人妖";
}
}
}
#endregion public virtual void Show()
{
Console.WriteLine("我是父类People的Show方法");
} }
}

子类Student

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的实现
{
/// <summary>
///
/// </summary>
class Student : People //实现多态必须要实现方法的重写,实现重写,必须要实现继承
{
public override void Show()
{ Console.WriteLine("我是Student类的Show方法");
}
//public override void Show()
//{
// //方法重写默认是,调用父类的同名方法
// base.Show();
//}
}
}

子类Teacher

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的实现
{
class Teacher:People //实现多态必须要实现方法的重写,实现重写,必须要实现继承
{
override public void Show()
{
Console.WriteLine("我是teacher类的Show方法");
}
}
}

测试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的实现
{
class Program
{
static void Main(string[] args)
{
//创建父类变量
People[] p = new People[]; //实例化子类对象
p[] = new Student();
p[] = new Teacher(); //写出通用代码
p[].Show();
p[].Show();
Console.ReadKey();
}
}
}

例子2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的练习
{
class Animal
{
public virtual void GetFood()
{
//虚方法往往不知道,怎么实现。
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的练习
{
class LaoYing:Animal
{
public override void GetFood()
{
Console.WriteLine("老鹰靠俯冲捕食。");
//base.GetFood();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的练习
{
class Snack:Animal
{
public override void GetFood()
{
Console.WriteLine("蛇靠偷袭捕食");
//base.GetFood(); //虚方法提供了默认实现,就是调用父类的方法
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 多态的练习
{
class Program
{
static void Main(string[] args)
{
//实现多态的步骤
//1.先写好父类,和可以被重写的方法
//2.写好子类,重写父类的方法
//3.声明父类变量,实例化子类对象 Animal[] ans = new Animal[];
ans[] = new Snack();
ans[] = new LaoYing(); foreach (var item in ans)
{
item.GetFood();
}
Console.ReadKey();
}
}
}

结果是:

C#多态--虚方法实现多态的更多相关文章

  1. C#面向对象(四)虚方法实现多态

    一.虚方法实现多态 1,创建一个people基类 using System; using System.Collections.Generic; using System.Linq; using Sy ...

  2. c#基础学习(0706)之使用虚方法实现多态

    使用虚方法实现多态 namespace _0706 { class Program { static void Main(string[] args) { //这个时候调用的是父类的方法 Person ...

  3. C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-

    1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...

  4. .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串

    1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...

  5. c# 多态 虚方法

    多态: 为了解决同一种指令,可以有不同行为和结果 在运行时,可以通过调用同一个方法,来实现派生类中不同表现. 虚方法——抽象类——抽象函数——接口 虚方法: 被virtual 关键字修饰的方法  叫做 ...

  6. Java 多态 虚方法

    Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载. 看代码: package com.company; public class Main { public stati ...

  7. 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  8. 转载总结 C# 多态(虚方法,抽象,接口实现)

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  9. Csharp多态的实现(虚方法)

    1.什么是抽象类 1.1虚方法是用virtual修饰,在子类中用override进行重写 1.2虚方法是一个方法,放在类里面(可以再下面的代码中看到) 1.3虚方法可以 重写,也可以不重写(这个可以再 ...

随机推荐

  1. SimpleTemplate模板引擎开发

    模板引擎相信大家是经常使用的,但是实现原理估计没多少人知道(你要是说不就是replace嘛,那我也无话说了...). 先来看看这个SimpleTemplate想实现的是什么功能吧: 是个C#端的模板引 ...

  2. Linux--Ubuntu12.04下安装JDK

    前言 在Ubuntu中安装JDK的方法非常的多,网上现在介绍的很多方法,都不是很清楚,对于初学者,很多都不太明白如何安装.本篇博客就Ubuntu下安装JDK进行详细的讲解,这里使用的Ubuntu版本为 ...

  3. 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...

  4. dubbo通信协议之对比

    对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ...

  5. Spring3系列3 -- JavaConfig

    Spring3系列3-JavaConfig-1 从Spring3开始,加入了JavaConfig特性,JavaConfig特性允许开发者不必在Spring的xml配置文件中定义bean,可以在Java ...

  6. Spring整合JAX-WS

    Jax-ws在使用上很方便,也很轻量级.重点是他是jvnet(dev.java.net)的项目,是基于java标准的(JSR181). 不过它与Spring的整合相对麻烦,于此,我将自己的一些研究结果 ...

  7. css3彩色进度条

    <html>    <head>        <title>progress</title>        <script type=" ...

  8. GCC 4.8.2 编译安装

      https://my.oschina.net/u/728245/blog/184550 摘要: GCC 4.8.2 在 CentOS 6.5 下编译安装小记,遇到一些问题并解决. 以前从没有升级过 ...

  9. UML3

    在UML系统开发中有三个主要的模型: 功能模型: 从用户的角度展示系统的功能,包括用例图. 对象模型: 采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类图. 动态模型: 展现系统的内部行为 ...

  10. failed jobs because of past close date,关工单报错

    今天会计反映关不了工单.我们公司关工单的程序是自己开发的,可以整批关.报如下错误.我试着用Standad程序关,可以.看来应该是我们开发的程序有问题.后来发现,是抛到WIP_DJ_CLOSE_TEMP ...