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#设计模式学习笔记:简单工厂模式( ...
随机推荐
- 如何使用npm的部分用法以及npm被墙的解决方法
我们要明白我们使用的npm就是node中自带的包(模块)管理工具:借助NPM可以帮助我们快速安和管理依赖包,使Node与第三方模块之间形成了一个良好的生态系统. 我们可以直接输入npm,查看帮助引导: ...
- PHP+Swoole 作为网络通信框架
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- JS基础语法---一元运算符
* ++ -- 都是运算符 * ++ 和 -- 可以分为:前+ 和后+ and 前- 和后- * 如果++在后面:如: num++ +10参与 ...
- vue学习笔记(三): 启动说明
1.启动页面:index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- 我认为现代IDE编辑器应该具有的几个特性和Visual studio 2010增强
工作中要使用 VS 2010, 有好多年没有使用Visual studio 了, 试了一小会, 发现VS 2010 缺少不少现代IDE应有的特性, 我认为重要的是下面几个特性, VS2010 已经是1 ...
- logstash的安装,启动与输出
在相应的目录下 wget https://artifacts.elastic.co/downloads/logstash/logstash-6.6.2.tar.gz 解压 tar -zxvf log ...
- rabbitmq和kafka大概比较
两者都是一个分布式架构 kafka 具有较高的吞吐量,rabbimq 吞吐量较小 rabbitmq 的可靠性更好,确认机制(生产者和 exchange,消费者和队列),支持事务,但会造成阻塞,委托(添 ...
- 关于APICloud与DCloud的我的一些看法
最近因为项目需要,研究了一下市场较为流行的四种移动开发平台:Wex5.APPcan.Dcloud.APICloud,Wex5因为界面UI较为老旧,且语法和js有较大出入,APPcan不开源等缘故,主要 ...
- 【树状数组】2019徐州网络赛 query
(2)首先成倍数对的数量是nlogn级别的,考虑每一对[xL,xR](下标的位置,xL < xR)会对那些询问做出贡献,如果qL <= xL && qR >= xR, ...
- 2019.6.11_MySQL进阶二:主键与外键
通过图形界面(UI)创建外键 打开设计表,在对应的栏位填写相应的内容.其中FK_deptno是限制名 # 先给主表建立主键 ALTER TABLE dept ADD PRIMARY KEY(dep ...