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虚方法可以 重写,也可以不重写(这个可以再 ...
随机推荐
- Intellij Idea 15 旗舰版 破解
转自:http://my.oschina.net/nyp/blog/533991(良心呀,真的好使) 注册方法: 注册码可以沿用14的,只是在 注册时选择 License server ,填 ht ...
- O2O地图应用之判断用户订单地址是否在服务范围内
O2O地图应用之判断用户订单地址是否在服务范围内 需求分析 在o2o项目中,经常要用到在用户下单时判断用户所填地址的坐标点是否在服务范围内的情况,这里参考网上的实现方式,用C#来实现,经测试后有效,特 ...
- ECshop设置301最快捷最简单的方法
ECshop设置301最快捷最简单的方法 在 init.php中加入以下代码 if (strtolower($_SERVER['SERVER_NAME'])!='www.fz1688.com') { ...
- 关于在mac 配置eclipse c开发
新建一个c 项目,如下 勾选hello world ANSL project ,勾选右边的MacOSX GCC 安装插件CDT - http://download.eclipse.org/tools/ ...
- 重建 windows 图标缓存
执行命令: ie4uinit –show 好像可以吧?
- swift 如何删除subviews
scrollView.subviews.map { (var view) -> () in if (view is UIButton) { view.removeFromSuperview() ...
- Win7 64位 Visio反向工程(MySQL)
1 看Office的版本,我安装的是32位的版本,故要去MySQL的官网下载对应32位的ODBC驱动: http://dev.mysql.com/downloads/connector/odbc/ 2 ...
- Android M Permission 学习笔记
Android应用权限简要介绍 一个Android应用默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, 一个应用是没有权利去进行一些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应 ...
- C代码中如何调用C++ C++中如何调用C
注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反. 集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译 ...
- Webstorm 11 注册/破解方法
激活时选择第二个,也就是License server在下面输入框中填http://idea.lanyus.com就行了