C#多态--虚方法实现多态
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#多态--虚方法实现多态的更多相关文章
- C#面向对象(四)虚方法实现多态
一.虚方法实现多态 1,创建一个people基类 using System; using System.Collections.Generic; using System.Linq; using Sy ...
- c#基础学习(0706)之使用虚方法实现多态
使用虚方法实现多态 namespace _0706 { class Program { static void Main(string[] args) { //这个时候调用的是父类的方法 Person ...
- C#属性-索引器-里氏替换-多态-虚方法-抽象-接口-泛型-
1.属性 //属性的2种写法 public class person { private string _name; public string Name { get { return _name; ...
- .net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串
1.继承(1)创建子类对象的时候,在子类对象中会为子类对象的字段开辟空间,也会为父类的所有字段开辟空间,只不过父类私有的成员访问不到(2)子类从父类继承父类所有的非私有成员,但是父类的所有字段也会创建 ...
- c# 多态 虚方法
多态: 为了解决同一种指令,可以有不同行为和结果 在运行时,可以通过调用同一个方法,来实现派生类中不同表现. 虚方法——抽象类——抽象函数——接口 虚方法: 被virtual 关键字修饰的方法 叫做 ...
- Java 多态 虚方法
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载. 看代码: package com.company; public class Main { public stati ...
- 《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...
- 转载总结 C# 多态(虚方法,抽象,接口实现)
前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...
- Csharp多态的实现(虚方法)
1.什么是抽象类 1.1虚方法是用virtual修饰,在子类中用override进行重写 1.2虚方法是一个方法,放在类里面(可以再下面的代码中看到) 1.3虚方法可以 重写,也可以不重写(这个可以再 ...
随机推荐
- 编译fresco源码
同步发表于http://avenwu.net/fresco/2015/05/07/build_fresco_sample fresco出来已经有一阵子了,曾经尝试过一次clone源码编译,主要是看其自 ...
- LeetCode: Unique Paths II 解题报告
Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution Fol ...
- 高效开发Android App的10个建议
假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比.耗电.耗内存.接下来就会得到用户的消极评论,最后名声也就臭了.即使你的应用设计精良.创意无限也没用. 耗电或者内存占用等 ...
- java后台进程和线程优先级
1. 后台线程:处于后台运行,任务是为其他线程提供服务.也称为“守护线程”或“精灵线程”.JVM的垃圾回收就是典型的后台线程. 特点:若所有的前台线程都死亡,后台线程自动死亡. 设置后台线程:Thre ...
- 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求
原文:http://www.cnblogs.com/dudu/archive/2009/11/10/1600062.html 今天下午17点左右,博客园博客站点出现这样的错误信息: Error Sum ...
- Workday为何迟迟不进入中国
全球知名HRM SaaS厂商Workday在世界各地攻城拔寨,俨然是HR SaaS的代名词,更是HRM市场的领导品牌.但是却单单在中国市场悄无声息,除了为数不多的海尔海外.联想海外等规模客户和部分ro ...
- arcgis ERROR:000824 该工具未获得许可
当时上面还说点击000824进入帮助文档,它说是由于扩展功能未勾选,于是我勾上,结果还是不行,后来它说可能是没有许可,于是我把license重新授权了一遍,结果,还是不行 其实,解决方法是在catal ...
- 【redmine】密码忘了后重新设置
有段时间没有使用,忘记了原来的密码,搜索网上有一篇文章,不过版本比较老,和现在文件位置不一样,参考后成功重置了密码,感谢原作者. 原文内第一步一般是不需要的.主要是用ruby命令修改数据库内容. 进入 ...
- PHP vs Python
最近在搞微信公众号方面的开发,发现很多开发微信公众号都使用PHP来开发,由于我之前开发Web端喜欢使用Python,所以从Quora网站找出一篇Which-is-better-PHP-or-Pytho ...
- 使用jQuery开发一个带有密码强度检验的超酷注册页面
在今天的jQuery教程中,我们将介绍如何使用jQuery和其它相关的插件来生成一个漂亮的带有密码强度检验的注册页面,希望大家喜欢! 相关的插件和类库 complexify - 一个密码强度检验jQu ...