虚方法/非虚方法 < 实例方法 = 非静态方法 = 非类方法(非实例方法 = 静态方法 = 类方法)
函数签名(参数列表,或参数列表 + 返回类型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace m1w3d5_virtual
{
#region 多态 用虚方法实现
//多态实现 真的鸭子嘎嘎叫,木头鸭子吱吱叫,橡皮鸭子唧唧叫
//多态 不同的实际对象,在同一个指令(叫),有不同的表现
//不同的对象,如何统一管理 里氏转换:可以把子级当父级 如果这些不同的对象全继承自一个父类
//统一管理 如果把子级转换成了父级,子级的特性丢失了
//用虚方法可以 用父级管理并且保留子级的特性 已解决问题
//1,在实例方法前加 virtual
//2,在派生类中用 override 重写 同名/同签名的方法
//在一个虚方法被调用时,会根据最后重写的那个方法和实际类型来决定
//不会根据当前类型来执行方法
class Duck
{
public string name;
public virtual void Cry()
{
Console.WriteLine(",我是{0}", name);
}
}
class TrueDuck : Duck
{
public TrueDuck()
{
this.name = "真的鸭子";
}
public override void Cry()
{
Console.Write("嘎嘎");
base.Cry();
}
}
class WoodDuck : Duck
{
public WoodDuck()
{
this.name = "木头鸭子";
}
public override void Cry()
{
Console.Write("吱吱");
base.Cry();
}
}
class RubberDuck : Duck
{
public RubberDuck()
{
this.name = "橡皮鸭子";
}
public override void Cry()
{
Console.Write("唧唧");
base.Cry();
}
}
//
class BeiJingDuck : TrueDuck
{
public BeiJingDuck()
{
this.name = "北京烤鸭";
}
public override void Cry()
{
Console.WriteLine("欢迎光临,我是{0}",name);
//base.Cry();
}
}
#endregion
#region 多态 练习
//打卡 时间有不同
class Person
{
public string name;
public virtual void PunchCard()
{
Console.WriteLine(",我是{0}",name);
}
}
class Employee : Person
{
public Employee()
{
this.name = "员工";
}
public override void PunchCard()
{
Console.Write("{0},九点打卡", DateTime.Now);
base.PunchCard();
}
}
class Manager : Person
{
public Manager()
{
this.name = "经理";
}
public override void PunchCard()
{
Console.Write("{0},十一点打卡", DateTime.Now);
base.PunchCard();
}
}
class Programmer : Person
{
public Programmer()
{
this.name = "程序员";
}
public override void PunchCard()
{
Console.Write("{0},不用打卡", DateTime.Now);
base.PunchCard();
}
}
#endregion
class Program
{
static void Main(string[] args)
{
#region 多态 用虚方法实现
Random roll = new Random();
TrueDuck trueduck = new TrueDuck();
WoodDuck woodduck = new WoodDuck();
RubberDuck ruberduck = new RubberDuck();
trueduck.Cry();
woodduck.Cry();
ruberduck.Cry();
Console.WriteLine();
//当你转换成父类的时候,你会丢失子类的特性
Duck[] ducks = new Duck[];
for (int i = ; i < ducks.Length; i++)
{
int num = roll.Next(, );
if (num < )
{
ducks[i] = new RubberDuck();
}
else if (num < )
{
ducks[i] = new WoodDuck();
}
else if (num < )
{
ducks[i] = new WoodDuck();
}
else
{
ducks[i] = new BeiJingDuck();
}
}
foreach (var item in ducks)
{
item.Cry();
}
Console.WriteLine();
#endregion
#region 多态 练习
//打卡 时间有不同
Employee employee = new Employee();
Manager manager = new Manager();
Programmer programmer = new Programmer();
employee.PunchCard();
manager.PunchCard();
programmer.PunchCard();
Console.WriteLine();
#endregion
}
}
}

C#学习笔记(十四):多态、虚方法和抽象类的更多相关文章

  1. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  2. (C/C++学习笔记) 十四. 动态分配

    十四. 动态分配 ● C语言实现动态数组 C语言实现动态数组,克服静态数组大小固定的缺陷 C语言中,数组长度必须在创建数组时指定,并且只能是一个常数,不能是变量.一旦定义了一个数组,系统将为它分配一个 ...

  3. C++学习基础十二——纯虚函数与抽象类

    一.C++中纯虚函数与抽象类: 1.含有一个或多个纯虚函数的类成为抽象类,注意此处是纯虚函数,而不是虚函数. 2.如果一个子类继承抽象类,则必须实现父类中的纯虚函数,否则该类也为抽象类. 3.如果一个 ...

  4. 【转】angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  5. angular学习笔记(十四)-$watch(1)

    本篇主要介绍$watch的基本概念: $watch是所有控制器的$scope中内置的方法: $scope.$watch(watchObj,watchCallback,ifDeep) watchObj: ...

  6. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  7. Swift学习笔记十四:构造(Initialization)

         类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态.     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...

  8. JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)

    1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...

  9. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  10. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

随机推荐

  1. SQL Server中灾难时备份结尾日志(Tail of log)的两种方法

    转自:http://www.cnblogs.com/CareySon/archive/2012/02/23/2365006.html SQL Server中灾难时备份结尾日志(Tail of log) ...

  2. dedecms利用addfields body在首页调用文章内容

    开源程序比较好的一点是可以进行二次开发,比如ytkah想要开发一个专家出诊表的功能模块,如下图所示,每天的专家都不一样,可以用到内容模型,但是相对比较复杂:我们可以把每天的坐诊情况写成一篇文章再通过调 ...

  3. java读取resource目录下的配置文件

    java读取resource目录下的配置文件 1:配置resource目录 下的文件 host: 127.0.0.1 port: 9300 2:读取    / 代表resource目录 InputSt ...

  4. Spark2.x学习笔记:Spark SQL程序设计

    1.RDD的局限性 RDD仅表示数据集,RDD没有元数据,也就是说没有字段语义定义. RDD需要用户自己优化程序,对程序员要求较高. 从不同数据源读取数据相对困难. 合并多个数据源中的数据也较困难. ...

  5. for与while的特点及其if在什么情况下使用情况

    for和while的特点: 什么时候使用循环结构呢? 1:当对某些代码执行很多次时,使用循环结构完成. 2:当对一个条件进行一次判断时,可以使用if语句. 3:当对一个条件进行多次判断时,可以使用wh ...

  6. uvloop —— 超级快的 Python 异步网络框架

    简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...

  7. SqlAlchemy个人学习笔记完整汇总-转载

    使用 sqlalchemy 有3种方式: 方式1, 使用raw sql; 方式2, 使用SqlAlchemy的sql expression; 方式3, 使用ORM.   前两种方式可以统称为 core ...

  8. unp第七章补充之TCP半开连接与半闭连接

    半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Duplex)协议,因此这里的半连接"半"字就是相对于全双工的"全&q ...

  9. 错误源:.net SqlClient data provider

    下午在做毕业设计的时候,想删除数据库的一条数据,结果发现删除的时候老是出现 ======错误源:.net SqlClient data provider==== 这样的错误:本来以为是我还在运行着项目 ...

  10. MyBatis学习笔记(七)——Mybatis缓存

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270403.html 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓 ...