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. uestc_retarded 模板

    虽然这个队,以后再也没有了,但是他的模板,是永垂不朽的![误 #include <ext/pb_ds/priority_queue.hpp> __gnu_pbds::priority_qu ...

  2. android设置背景半透明效果

    1.Button或者ImageButton的背景透明或者半透明 半透明:<Button android:background="#e0000000"···> 透明:&l ...

  3. 修饰者模式(装饰者模式,Decoration)

    1. 装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 2.组合和继承的区别 继承.继承是给一个类添加行为的比较有效的途径.通过使用继承,可以使得子类在拥有 ...

  4. 配置ini指定eclipse启动JDK版

    eclipse mars1 需要JDK 1.7+ 解决方案: 改eclipse.ini配置文件 -startupplugins/org.eclipse.equinox.launcher_1.3.100 ...

  5. Android开发在路上:少去踩坑,多走捷径

    转自:http://djt.qq.com/article/view/1193   最近一朋友提了几个Android问题让我帮忙写个小分享,我觉得对新人还是挺有帮助的,所以有了这个小分享. 1.目前, ...

  6. 实例学习Backbone.js(一)

    前面有两篇文章介绍了Backbone的model.collection和view,那么接下来我想用一个完整的Demo来记录我学习的过程, 单页操作,实现数据的增删改,后台使用json做数据库,通过re ...

  7. MFC资源冲突解决方法

    AFX_MANAGE_STATE(AfxGetStaticModuleState())   先看一个例子: 1.创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID ...

  8. VMware的使用

    1.问题的提出   现在所有的组装台式机,均以64位操作系统作为平台   而且USB接口均以USB3.0默认   windows7 64位和windows 10 64位是主流   那么建立在windo ...

  9. make no mistake, we are the last line of defense.

    make no mistake, we are the last line of defense.

  10. 几种在Linux下查询外网IP的办法

    原文地址:http://my.oschina.net/epstar/blog/513186 Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl ...