C#中的virtual & override
很奇怪的设计,需要靠着两个Keyword共同作用,才能完成多态——而不是类似Java那样的默认多态。所谓共同作用,即基类使用virtual 标示函数,子类使用override显示重写。
有点奇怪,MSDN说了一大堆情境,但我仍然认为增加了多义性与复杂性。
class MainClass
{
public static void Main (string[] args)
{
var s1 = new Student ("Jim");
s1.Say ();
s1.Do ();
var p1 = s1 as Person;
p1?.Say ();
p1?.Do ();
var s2 = p1 as Student;
s2?.Say ();
s2?.Do ();
}
}
class Person
{
public string Name { get; set;} = string.Empty;
public Person(string name)
{
Name = name;
}
public void Say()
{
WriteLine ($"{Name} Says:");
}
public virtual void Do()
{
WriteLine ($"{Name} Do:");
}
}
class Student : Person
{
public Student(string name) : base(name)
{
}
public void Say()
{
WriteLine ($"Student {Name} Says:");
}
public override void Do()
{
WriteLine ($"Student {Name} Do:");
}
}
Output:
Student Jim Says:
Student Jim Do:
Jim Says:
Student Jim Do:
Student Jim Says:
Student Jim Do:
不使用virtal & override在转型过程中并不会丢失实例信息,但是函数不存在多态特性。
C#中的virtual & override的更多相关文章
- c#中的 virtual override 和abstract 以及sealed
1.如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法,而不能覆盖. 2.如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏. 3.如果子类 ...
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
- c#中abstract、override、new、virtual、sealed使用
abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽象类,则这个类智能是其他某个类的基类.抽象方法在抽象类中没有函数体.抽象类中的抽象方法是没有方法体的,继承其的子类必须实现 ...
- c#中abstract、override、new、virtual、sealed使用和示例
原文地址:http://blog.csdn.net/richerg85/article/details/7407544 abstract 修饰类名为抽象类,修饰方法为抽象方法.如果一个类为抽 ...
- C#中的Virtual
在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new ...
- NO.8:绝不在构造或者析构过程中调用virtual函数
在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数) 如果在base class 构造函数或者析构函数调用virtual ...
- C#学习笔记(16)——C#中重写(override)和覆盖(new)的区别
说明(2017-7-17 23:04:45): 原文: C#中重写(override)和覆盖(new)的区别 重写 用关键字 virtual 修饰的方法,叫虚方法.可以在子类中用override 声明 ...
- C# virtual,override,new 整理
今天仔细学习了一下C#中virtual, override, new关键字,参考了网上的很多资料,现整理一下. Virtual: virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可 ...
- C#关于private protected sealed Virtual/Override
Public:公开权限 Private:修饰类时类为程序集或者包含此类的类内部权限:修饰变量时只能类内部使用: Protected:修饰变量,只能继承类可以使用,对外(包括继承类的实例)无权限: Ab ...
随机推荐
- ELF学习--装载过程
当我们在linux bash下执行ELF程序时,Linux系统是怎样装载和执行的呢? 1.bash进程fork出子进程 2.在bash的子进程中调用execve系统调用来执行指定的ELF. 3.exe ...
- CentOS6 下安装JDK7
1.下载JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html,选择Java SE 7,下载jdk-7u80-lin ...
- 解析Ceph: Snapshot
经常有开发者在邮件列表中会问到Ceph Snapshot的实现方式,受限于目前有限的实现文档和复杂的代码结构和代码量,弄清楚Ceph Snapshot并不是一件容易的事.正好最近在重构Ceph存储引擎 ...
- mvc api odata 查询选项之 $inlinecount ,$format 选项
网上百度“odata 语法”会出来很多结果,其中有一项是比较一致的,那就是odata支持一下几种语法: $filter 条件表达式 -- 对应sql语句的where条件查询,如:/Categorie ...
- Java中移位操作运算符的理解
java中的移位运算符有三种: 1. <<: 左移 2. >>: 右移 3. >>>: 无符号右移 使用方法:左移就是将左边的操作数在内存中的二进制数据左移指 ...
- SAE J1708 DS36277 MAX3444, DS75176B
http://en.wikipedia.org/wiki/J1708 J1708 SAE J1708 is a standard used for serial communications betw ...
- Nginx (基于linux)综合
重启Nginx服务:centos:测试NGINX配置文件是否有效:/usr/local/nginx/sbin/nginx -t 平滑重启:/usr/local/nginx/sbin/nginx -s ...
- 删除重复记录(Mysql,SqlServer,Sqlite)
Mysql中有重复的数据: ) )> order by count() desc 删除一下吧: delete a from t_resource_apptype_releation as a, ...
- 【WebForm】Js调用后台C#方法
因业务的需要,有这么个需求,需要前台的JS传参调用C#后台的方法.现在有这么个方法可以解决,整理如下. 首先,先说一下基本实现,前台用Jquery的ajax将其中的URL后加方法,然后在Data中传递 ...
- 【M32】在未来时态下发展程序
1.在未来时态下发展程序,就是接受“事情总会变化”的事实,并准备应对之策. 2.记住,程序的维护者通常不是最初的开发者,因此,设计和实现的时候,应该考虑别人更好地理解,修改自己的程序. 3.重要的一点 ...