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();
}
}
}

结果是:

最新文章

  1. crawler4j 学习(二)
  2. postgresql+slony-i安装配置主从
  3. KendoUI系列:TabStrip
  4. mybaitis uuid插入和定义返回类型
  5. vue学习笔记之v-for与-repeat
  6. IOS开发-UIBarButtonItem系统自带图标总结
  7. shell脚本循环执行mysql语句
  8. 编程规范 html部分
  9. webmatrix
  10. [译]GotW #89 Smart Pointers
  11. Koa -- 基于 Node.js 平台的下一代 web 开发框架
  12. Java编程风格学习(三)
  13. jvm(三):对象
  14. Java辅助类持续汇总~
  15. react 入坑之罪
  16. java多态——基础
  17. 坦克大战java版
  18. 解决app频繁更新方案
  19. VC6 下 libpng 库的编译与初步使用
  20. 社区类 App 如何引导用户发帖和产生内容?

热门文章

  1. 手机前端页面js
  2. leetCode191/201/202/136 -Number of 1 Bits/Bitwise AND of Numbers Range/Happy Number/Single Number
  3. 【汇总】iOS开发及Xcode使用中遇到的一些报错问题汇总
  4. WinStore控件之Button、HyperlinkButton、RadioButton、CheckBox、progressBar、ScrollViewer、Slider
  5. 在多线程环境中使用CoreData
  6. UML2
  7. java之源码路径及api
  8. 再谈LRU双链表内存管理
  9. Ubuntu 中搭建 LAMP 及 php 开发工具
  10. 让我们一起Go(十三)