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#设计模式学习笔记:简单工厂模式( ...
随机推荐
- WeakHashMap,源码解读
概述 WeakHashMap也是Map接口的一个实现类,它与HashMap相似,也是一个哈希表,存储key-value pair,而且也是非线程安全的.不过WeakHashMap并没有引入红黑树来尽量 ...
- linux shell中$0,$?,$!等的特殊用法
记录下linux shell下的特殊用法及参数的说明 变量说明: $$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值 ...
- SpringBoot(八) SpringBoot整合Kafka
window下安装kafka和zooker,超详细:https://blog.csdn.net/weixin_33446857/article/details/81982455 kafka:安装下载教 ...
- Android 布局测试
wrap_content <Button android:id="@+id/button1" android:layout_width="wrap_content& ...
- PL/SQL编写的SQL语句插入SqlPlus时,报错 PLS-00302
最近刚开始用PL/SQL,然后发现写SQL语句时,运行的时候,会对表中的字段报错. 好像是对字段的使用有问题 原来写的错误代码大概像这样 DECLARE xuehao XSB.id% TYPE; BE ...
- [20190909]完善vim的bccacl插件.txt
[20190909]完善vim的bccacl插件.txt http://blog.itpub.net/267265/viewspace-2140886/http://blog.itpub.net/26 ...
- golang的析构函数
runtime.SetFinalizer 使用这个函数可以给一个对象设置一个析构函数,如果这个对象没有引用了,那么就会调用这个析构函数,然后会把这个对象给释放掉
- thinkPHP中怎么访问域名直接跳到后台登录页面
问题: 我想只访问域名就跳到后台登录页面,怎么把地址栏里的路径隐藏掉 答案: 修改配置Common里的conf文件夹里,把默认模块改成“Admin”,默认控制器改成“login”系统默认的默认模块式h ...
- 删除带外键的表【foreign key constraint fails】报错
title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...
- asp.net core全局异常过滤并监控系统BUG将异常信息记录到日志
添加: using Dw.Util.Helper; using Microsoft.AspNetCore.Mvc.Filters; using System; using System.Collect ...