C#使用虚拟方法实现多态
作者:一羽清宁 发布时间:2023-01-01 05:21:08
标签:C#,多态
本文实例讲述了C#使用虚拟方法实现多态。分享给大家供大家参考。具体分析如下:
我们看一个例子,假若有一个动物类,类中用方法cry()描述动物的叫声,不同的动物的叫声是不一样的。根据继承的特征,把类中公共部分的内容放在父类中,那么cry()方法就应该放在父类中,根据这样的思路编写程序如下:
using System;
class Anmial
{
public void Cry()
{
Console.WriteLine("这是动物的叫声");
}
}
class Dog: Anmial
{
public void Run()
{
Console.WriteLine("狗路得快");
}
}
class Cat: Anmial
{
public void Look()
{
Console.WriteLine("猫长得乖");
}
}
class Test
{
static void Main()
{
Dog mydog = new Dog();
mydog.Cry();
mydog.Run();
Cat mycat = new Cat();
mycat.Cry();
mycat.Look();
Console.ReadKey();
}
}
运行后发现狗和猫的叫声是相同的,都是调用了父类Cry()方法。现在希望在同一个方法Cry()能够体现出不同动物的叫声,那么在子类就应该重新描述Cry(),也就是重写Cry()方法。
重写方法就是修改它的实现,或者在派生类中对它进行重写。在父类中用virtual 关键字声明的方法在子类中可以重写,就是虚拟方法。虚拟方法的语法如下:
访问修饰符 virtual 返回类型 方法名()
{
//方法体
}
在父类中声明的虚拟方法,在子类中重写时用override关键字,就是将virtual关键字改成override,然后修改方法体中的代码即可。
我们修改上面的代码:
using System;
class Anmial
{
public virtual void Cry()
{
Console.WriteLine("这是动物的叫声");
}
}
class Dog: Anmial
{
public override void Cry()
{
Console.WriteLine("这是狗的叫声汪汪");
}
}
class Cat: Anmial
{
public override void Cry()
{
Console.WriteLine("这是猫的叫声喵喵");
}
}
class Test
{
static void Main()
{
Dog mydog = new Dog();
mydog.Cry();
Cat mycat = new Cat();
mycat.Cry();
Console.ReadKey();
}
}
注意:父类方法的访问级别和子类重写方法的访问级别相同,即它们应该有相同的访问修饰符。
例如:
public virtual void Hello()
不能重写为:
private override void Hello()
希望本文所述对大家的C#程序设计有所帮助。


猜你喜欢
- 如何使用union多表分页条件查询当前项目有一个全局搜索的功能,需要涉及到7-8张主表,由于当前项目使用的是Jpa,所以我决定使用原生sql
- 前言:项目中我们经常会遇到有时候需要等待其他线程完成任务后,主线程才能执行其他任务,那么我们将如何实现呢?Join 解决方案join 的工作
- 1、@Select注解基本用法@Select注解的目的是为了取代xml中的select标签,只作用于方法上面。下面看一下@Select注解的
- 写在前面最近有很多的粉丝私信我,说自己在面试的时候,老是被人问HashMap的原理,但是在实际的工作中,也只是使用HashMap,从来就没有
- 在搭建Spring Cloud Eureka环境前先要了解整个架构的组成,常用的基础模式如下图:服务提供者:将springboot服务编写好
- Android实现界面内嵌多种卡片视图,具体内容如下效果如图所示:1.选择某个界面时,对应的第几个小圆点亮:通过selector制造圆点和进
- 1、什么是 IOC?IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。传统的创建对象的方法是直
- 判断某字符串是否为空,为空的标准是str==null或str.length()==01.下面是StringUtils判断是否为空的示例:St
- 本文实例为大家分享了Android调用手机摄像头拍照和录音功能的具体代码,供大家参考,具体内容如下调用摄像头拍照:public class
- 可以用抽象工厂模式来造车。车的品牌有很多,而且车的属性也不少,比如车的类型、排量、门的数量,等等。可以提炼出有关车的一个抽象类:public
- springboot service内组件加载顺序先加载自身构造器,所以在构造器中初始化时若使用需要注入的(即@Autowired注解的)组
- 本文实例讲述了Java获取UTC时间的方法。分享给大家供大家参考,具体如下:取得本地时间:java.util.Calendar cal =
- 要画这种圆形带阴影的头像,个人分解成三个图层1,先画头像边缘的渐变RadialGradient gradient = new RadialG
- easyExcel简介:Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的
- 背景:我们在开发的过程中可能需要随机生成一个ID,例如数据库中的某个ID有时候也要对其进行校验。UUID:UUID,是Universally
- 样式效果 还是先来看效果: 这是一个仿雷达扫描的效果,是之前在做地图sdk接入时就想实现的效果,但之前由于赶着毕业设
- volatile关键字相信了解Java多线程的读者都很清楚它的作用。volatile关键字用于声明简单类型变量,如int、float、boo
- 学习完数组就能用C语言写出的简单小游戏:编译器使用的为VS2013代码分为三个部分1、头文件 game.h2、源文件 game.c 用来存放
- 本文对原文:android实现计步功能初探,计步项目进行了精简,移除了进程服务和计时、守护进程、数据库保存等等,方便扩展功能。本文源码:ht
- 详解Java中HashSet和TreeSet的区别1. HashSetHashSet有以下特点:不能保证元素的排列顺序,顺序有可能发生变化不