C# 学习笔记 多态(一)虚方法
在面对对象编程中,类的三大特性分别为封装,继承,多态。其中多态的具体实现,依赖于三个方法,也就是虚方法,抽象类和接口。
多态的具体作用是什么呢?或者说多态的存在有什么意义呢?多态的存在有效的降低了程序的耦合度,在使用的时候,不仅可以表现大家都有的共性,还能在必要的时候突出一些特殊的的个性。
那么如何用上文三个方法实现多态呢?
今天先说下虚方法:
首先,我们定义一个人类的基类。其中包含了这个人的姓名和国籍。
class Person
{
public string Name;
public string Country;
public void Introduce()
{
Console.WriteLine("我的名字是"+Name);
Console.WriteLine("我来自"+Country);
}
}
然后我们添加一个类。
class People1:Person
{ }
此时我们进行创建对象赋值引用
People1 ch = new People1();
ch.Name = "小明";
ch.Country = "中国";
ch.Introudce(); 运行结果:
我的名字是小明
我来自中国
如果所有人都是中国人,那么这个方法足以胜任,可偏偏就有这么一个人,来自外国,不会中文,那么这个介绍的方法就有点拗口了。这就是特例,存在即合理,总不能因为他特殊就把他抹杀了吧。这时多态站出来喊了一句:”我发量多,让我来!“。
虚方法:在类方法声明前加上了virtual 修饰符,就称之为虚方法,反之为非虚。并且在使用了virtual 修饰符后,不允许再有static, abstract, 或override 修饰符。有了这个虚方法,我们就可以十分容易的解决这个特例。
首先我们需要修改一下基类中的介绍方法,让它虚化,成为一个虚方法(说白了就是加个修饰符 virtual)
class Person
{
public string Name;
public string Country;
public virtual void Introudce()//添加修饰符virtual让介绍这个方法变成虚方法
{
Console.WriteLine("我的名字为"+Name);
Console.WriteLine("我来自"+Country);
}
}
然后我们将这个不合群的特例添加进来,并且专门为他的与众不同,对方法进行更改,我们称之为重写(override)。
class People2
{
public override void introduce()
{
Console.WriteLine("My name is "+Name);
Console.WriteLine("I'm from "+Country);
}
}
接下来我们只需要将大象装进冰箱即可。创建对象,赋值引用
People2 Eup = new People2();
Eup.Name = "Jack";
Eup.Country = "American";
Eup.Introudce(); 运行结果:
My name is Jack
I'm from American
不需要进行大规模的修改,根据需要进行修改,在不需要修改的时候可以进行原有的方法使用,这就是虚方法的优点。
以上是我个人的一些拙略见解,如果有误,有幸被前辈看到,也希望前辈能不吝赐教,感谢感谢!!!
C# 学习笔记 多态(一)虚方法的更多相关文章
- C#学习笔记(十四):多态、虚方法和抽象类
		
虚方法/非虚方法 < 实例方法 = 非静态方法 = 非类方法(非实例方法 = 静态方法 = 类方法) 函数签名(参数列表,或参数列表 + 返回类型) using System; using Sy ...
 - C#-面向对象的三大特性——多态(虚方法与重写、抽象类、接口)
		
多态 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果.在运行时,可以通过指向基类的指针,来调用实现派生类中的方法. 编译时的多态性:编译时的多态性是通过重载来实现的.对于非虚的成员来说 ...
 - 【python学习笔记】9.魔法方法、属性和迭代器
		
[python学习笔记]9.魔法方法.属性和迭代器 魔法方法:xx, 收尾各有两个下划线的方法 __init__(self): 构造方法,创建对象时候自动执行,可以为其增加参数, 父类构造方法不会被自 ...
 - Java8学习笔记(八)--方法引入的补充
		
在Java8学习笔记(三)--方法引入中,简要总结了方法引入时的使用规则,但不够完善.这里补充下几种情况: 从形参到实例方法的实参 示例 public class Example { static L ...
 - c#基础学习(0706)之使用虚方法实现多态
		
使用虚方法实现多态 namespace _0706 { class Program { static void Main(string[] args) { //这个时候调用的是父类的方法 Person ...
 - 转载总结 C# 多态(虚方法,抽象,接口实现)
		
前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...
 - 【原创】SystemVerilog中的多态和虚方法
		
封装可以隐藏实现细节,使代码模块化,继承可以扩展已经存在的代码模块,目的都是为了代码重用.多态是为了实现接口的重用.在SystemVerilog中,子类和父类之间多个子程序使用同一个名字的现象称为Sy ...
 - C# 学习笔记 多态(二)抽象类
		
多态是类的三大特性之一,抽象类又是多态的实现方法之一.抽象类是什么呢,如果把虚方法比作一个盛有纯净水的杯子,那么此时的“纯净水”就是事先定义好的方法,我们可以根据不同的需求来改变杯子中所事先盛放的是“ ...
 - C#设计模式学习笔记:(2)工厂方法模式
		
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...
 
随机推荐
- PHP作用域和文件夹操作
			
1.作用域 1.1变量作用域 1.全局变量:在函数外面 2.局部变量:在函数里面,默认情况下,函数内部是不会访问函数外部的变量 3.超全局变量:可以在函数内 ...
 - PHP odbc_errormsg ODBC 函数
			
定义和用法 odbc_errormsg - 获取最后一条错误消息 语法 odbc_errormsg ( [ resource $connection_id ] ) 返回包含最后一个ODBC错误消息的字 ...
 - union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单
			
这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...
 - ucoreOS_lab6 实验报告
			
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
 - mysql查询两张表更改一张表数据
			
(user 为要更改数据的表 ,set后边需要更改的内容, where后加条件) update user a,user_copy b set a.manager_introduct=b.rwjs wh ...
 - 生成前N个自然数随机置换的3个程序
			
问题描述: 假设需要生成前N个自然数的一个随机置换.例如,{4,3,1,5,2}和{3,1,4,2,5}就是合法的置换,但{5,4,1,2,1}却不是,因为数1出现两次而数3却没有.这个程序常常用于模 ...
 - 记录一下自己在MVC项目中如何防CSRF攻击,直接上代码
			
1.前端的处理: 2.后台 1.)添加过滤器,哪里用放哪里 2.)需要验证的方法上直接添加过滤器即可 大功告成 以下为过滤器代码块 /// <summary>/// ajax中加上Anti ...
 - [Linux] 编写Dockerfile文件自动构建镜像
			
Dockerfile是一个文本文件,按顺序包含构建给定镜像所需的所有命令Docker通过读取Dockerfile中的指令自动构建图像 . Dockerfile遵循特定的格式和指令集,您可以在Docke ...
 - Hadoop序列化案例实操
			
需求 统计每一个手机号耗费的总上行流量.下行流量.总流量. 输入数据: 1 13736230513 192.196.100.1 www.atguigu.com 2481 24681 200 2 138 ...
 - java面试填坑解惑篇
			
感谢原文出处:https://www.cnblogs.com/javazhiyin/ NO1.请简单描述JDK和JRE的区别? NO1.回答JDK和JRE的区别这道题,首先要回答两个名次的概念,JDK ...