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在转型过程中并不会丢失实例信息,但是函数不存在多态特性。
最新文章
- requestAnimationFrame,Web中写动画的另一种选择
- STM32——DMA接收和发送的实现
- HTML5 WebStorage
- iOS开发——UI进阶篇(十三)UITabBarController简单使用,qq主流框架
- sscanf函数和正则表达式
- usb驱动开发8之配置描述符
- 提示框的优化之自定义Toast组件之(二)Toast组件的业务逻辑实现
- Strange Towers of Hanoi
- Awesome Delphi
- 使用 sphinx 制作简洁而又美观的文档
- Unity塔防游戏开发
- 项目Beta冲刺Day3
- 简单介绍一下在CentOS上安装Docker。
- Confluence 6 审查日志
- 洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
- C++笔试易错题集(持续更新)
- dip和px的相互转化
- tomcat源码阅读之载入器(Loader)
- /usr/include/glib-2.0/glib/gtypes.h:34:24: fatal error: glibconfig.h: No such file or directory
- jquery控制元素的隐藏和显示的几种方法。
热门文章
- Objc基础学习记录2
- .Net项目版本号的生成
- 使用Canvas把照片转换成素描画
- 标准Dispose实现 (转)
- Codeforces Round #340 (Div. 2) D. Polyline 水题
- [每日一题] OCP1z0-047 :2013-08-06 外表部――相关描述
- NGINX源代码剖析 之 CPU绑定(CPU亲和性)
- TP复习12
- 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配
- CENTOS YUM软件源