【c# 学习笔记】使用virtual和override关键字实现方法重写
只有基类成员声明为virtual或abstract时,才能被派生类重写;而如果子类想改变虚方法的实现行为,则必须使用override关键字。
public class Animal
{
private int _age; public int Age
{
get { return _age; }
set
{
//这里假设牛的寿命为10年。 if(value < ||value >)
{
throw (new ArgumentOutOfRangeException("AgeIntPropery", value, "年龄必须在0-10之间")); }
_age = value;
}
} //几乎所有动物都具备发出声音的能力
/// <summary>
/// 但是对于动物来说,每个动物发出的声音都不一样
/// </summary>
public virtual void Voice()
{
Console.WriteLine("动物开始发出声音");
} //马(子类) public class Horse:Animal
{
//通过override关键字来重写父类方法
public override void Voice()
{
base.Voice();
Console.WriteLine("马儿发出嘟...嘟....嘟....的声音");
} } //羊 (子类)
public class Sheep:Animal
{
public override void Voice()
{
//调用基类方法
base.Voice();
Console.WriteLine("羊发出咩...咩...咩...的声音");
} }
static void Main(string[] args)
{ Animal horse = new Horse();
horse.Voice(); Animal sheep = new Sheep();
//相同类型的对象调用相同的方法表现出不同的行为
sheep.Voice();
Console.Read();
}
通过使用virtual关键字,把需要在子类中表现为不同行为的方法定义为虚方法,然后在子类中使用override关键字对基类方法进行重写。这样,每个基类在调
用相同的方法时将表现出不同的行为,这段代码正是c#中多态的实现。
若子类还想继续访问基类定义的方法,则可以使用Base关键字来完成调用。

如图运行结果可以看出,相同类型的对象调用相同的方法确实表现了不同的行为,这就是多态的精髓所在。
但是,上面的代码还存在一个问题;我们可以通过new操作符创建Animal基类的实例,可Animal基类的作用是为所有子类提供公共成员,它是一个
抽象的概念,在实际的系统中我们希望能避免创建该类的实例。该怎么做?
对应c#,可以使用abstract关键字来防止在代码中直接创建这样的类的实例,如下:
public abstract class Animal
{ ..... }
酱紫 ,若尝试创建Animal实例,就会收到如下所示报错。
【c# 学习笔记】使用virtual和override关键字实现方法重写的更多相关文章
- vue学习笔记之:为何data是一个方法
vue学习笔记之:为何data是一个方法 在vue开发中,我们可以发现,data中的属性值是在function中return出来的.可为何data必须是一个函数呢?我们先看官方的解释: 当一个组件被定 ...
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写
一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...
- C++11学习笔记(5) —— override and final (转)
原文转自 http://blog.csdn.net/fire_lord/article/details/8540592 1.简介 C++为我们提供了继承和虚函数的重写特性. 在派生类中,重写虚函数不强 ...
- python学习笔记(三)---python关键字及其用法
转载出处:https://www.cnblogs.com/ECJTUACM-873284962/p/7576959.html 前言 最近在学习Java Sockst的时候遇到了一些麻烦事,我觉得我很有 ...
- 疯狂java学习笔记之面向对象(四) - this关键字
Java中this关键字主要有以下两个方法: 1.this引用 - 可用于任何非static修饰的方法和构造器中,当this用于方法中时,它代表调用该方法的实例/对象;当this用于构造器中时,它代表 ...
- JavaScript学习笔记(三)this关键字
this是Javascript的关键字,代表在函数运行时,自动生成一个内部对象,只能在函数内部使用.例如: function test() { this.x = 1; } 随着函数的使用场合不同,th ...
- Robot Framework学习笔记(三)------常用关键字介绍
下面关键字全部由 Builtin 库提供,Builtin 为 Robot Framework 标准类库.Builtin库提供常用的关键字 1.log log 关键字就是编程语言里的"prin ...
- python3学习笔记一(标识符、关键字)
查看Python版本 可以命令窗口,windows使用win+R调出cmd运行框,输入以下命令: python -V 进入python的交互编辑模式,也可查看 D:\Python3.6\Scripts ...
随机推荐
- 微信小程序学习记录(一)
如何定义一个全局变量: 1,在根目录下app.js中添加 App({ globalData: { g_isPlayingMusic : false, g_currentMusicPostId :nul ...
- sql server 数据类型转换
--这是显示转换类型,将字符串转成整形SELECT CAST('1' AS int),CONVERT(int,'1')--SqlServer也会隐式转换,如:用字符串乘以一个整形,--整形优先级要大, ...
- SQL Server 表表达式--派生表、公用表表达式(CTE)、视图和内联表值函数
概述 表表达式是一种命名的查询表达式,代表一个有效地关系表.可以像其他表一样,在数据处理中使用表表达式. SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 为什么 ...
- 学到了林海峰,武沛齐讲的Day24-完 对象和实例
学到这里估计就是坎了...日志都不想写了.. 对象和实例
- mongodb 4.0.5 集群搭建五台集群
配置文件采用yaml方式来配置 生产中取消了仲裁者的角色,因为仲裁者也不会存储数据,只是起到选举的作用,线上为了保证数据安全,每份数据都会配置两个副本集,也就是每份数据存储了三份. 优化配置,采用五台 ...
- java类加载和对象初始化
对象初始化过程: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 3.其次,初 ...
- CF843D Dynamic Shortest Path spfa+剪枝
考试的T3,拿暴力+剪枝卡过去了. 没想到 CF 上也能过 ~ code: #include <bits/stdc++.h> #define N 100004 #define LL lon ...
- 【IOI2019】2048矩形模拟
/* dos windows 25*80 */ #include <algorithm> #include <windows.h> #include <iostream& ...
- js即时函数在异步回调中的运用
在编程中我们会接触到循环和异步编程的情况,这时异步回调执行逻辑就会出现问题.我们用setTimeout来模拟异步的: for(var i=0;i<3;i++){ setTimeout(funct ...
- 数据结构Java版之排序算法(二)
排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...