虚方法(virtual)
虚方法(virtual)
Virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。
看一段代码:
using System ;
class A
{
public void F()
{
Console.WriteLine ("A.F");
}
}
class B:A
{
public new void F() //注意new关键字
{
Console.WriteLine ("B.F");
}
}
class Test
{
static void Main()
{
B b = new B ();
A a = b;
a.F ();
b.F();
}
}
输出: A.F
B.F
上述代码在内存中如下图:
再看一段代码:
using System ;
class A
{
public virtual void F()
{
Console.WriteLine ("A.F");
}
}
class B:A
{
public override void F()
{
Console.WriteLine ("B.F");
}
}
class C:B
{
public new void F()
{
Console.WriteLine ("C.F");
}
}
class Test
{
static void Main()
{
C c = new C ();
A a = c;
a.F();
}
}
输出: B.F
->基类的成员会搜索继承链,找到使用了new修饰符的那个成员之前的成员,然后调用该成员。
多态(polymorphism):
多态是指两个或多个属于不同类的对象,对同一个消息做出不同响应的能力。
->virtual 和 override 关键字 : 多态给子类提供了一种方式,可以自定义如何实现基类所定义的方法;
看下面代码:
using System ;
class Employee
{
protected string _name;
public Employee () {}
public Employee (string name)
{
_name = name ;
}
public virtual void StartWork()
{
Console.WriteLine (_name+"开如工作");
}
}
class Manager:Employee
{
public Manager (string name):base (name){}
public override void StartWork()
{
base .StartWork (); //注意base的使用
Console .WriteLine ("下达任务");
}
}
class Seller:Employee
{
public Seller (string name):base (name){}
public override void StartWork()
{
base .StartWork ();
Console .WriteLine ("销售产品");
}
}
class Test
{
static void Main()
{
Employee [] emp = new Employee[2] ;
emp [0]=new Manager ("张三");
emp [1]=new Seller ("李四");
foreach (Employee e in emp )
{
e.StartWork ();
}
}
}
虚方法(virtual)的更多相关文章
- Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息 http://www.cnblogs.com/zhwx/archive/2012/08/28/266055 ...
- C#虚方法virtual详解
转: http://www.cnblogs.com/jason_yjau/archive/2009/08/25/1553949.html C#虚方法virtual详解 在C++.Java等众多OOP语 ...
- 虚方法(virtual)和抽象方法(abstract)的和接口(interface)的区别
虚方法(virtual)和抽象方法(abstract)的区别 2017年06月15日 13:41:26 阅读数:65 注:本文转载自 http://www.cnblogs.com/michaelxu/ ...
- 4.C#虚方法virtual详解
C#虚方法virtual详解 在C++.Java等众多OOP语言里都可以看到virtual的身影,而C#作为一个完全面向对象的语言当然也不例外. 虚拟函数从C#的程序编译的角度来看,它和其它一般的函数 ...
- 抽象方法(abstract method) 和 虚方法 (virtual method), 重载(overload) 和 重写(override)的区别于联系
1. 抽象方法 (abstract method) 在抽象类中,可以存在没有实现的方法,只是该方法必须声明为abstract抽象方法. 在继承此抽象类的类中,通过给方法加上override关键字来实现 ...
- 虚方法virtual详解
虚方法virtual详解 从C#的程序编译的角度来看,它和其它一般的函数有什么区别呢?一般函数在编译时就静态地编译到了执行文件中,其相对地址在程序运行期间是不发生变化的,也就是写死了的!而虚函数在 ...
- [转]虚方法(virtual)和抽象方法(abstract)的区别
虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化.如: //抽象方法pub ...
- 虚方法(virtual)和抽象方法(abstract)的区别
注:本文转载自 http://www.cnblogs.com/michaelxu/archive/2008/04/01/1132633.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别 ...
- 虚方法virtual、抽象方法abstract、接口interface区别
接口.抽象类.抽象方法.虚方法: 这四个名词时非常容易混淆的: 首先说一下接口 与抽象类 的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样 ...
随机推荐
- 关于ie6 下背景图片不透明以及Img不透明
ie6 下背景图片不透明的方法,加上下面的js即可解决 //解决IE6下图片不透明 function correctPNG() // correctly handle PNG transparency ...
- 数据库DCL、DDL、DML、DQL
SQL三部分:data manipulation language DCL: (控制)管理用户权限(GRANT.REVOKE),数据库整体配置 DDL: (定义)作用于数据库,表, ...
- POJ3111 K Best —— 01分数规划 二分法
题目链接:http://poj.org/problem?id=3111 K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissio ...
- codeforces B. Sereja and Mirroring 解题报告
题目链接:http://codeforces.com/contest/426/problem/B 题目意思:给出一个n * m的矩阵a,需要找出一个最小的矩阵b,它能通过several次的mirror ...
- ComboBox联动 (AJAX BS实现)
//从webservice中取数据ajax Ext.Ajax.request({ url: 'WebService.asmx/GetComboxFi ...
- jsch上传文件功能
转载:http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html JSch是Java Secure Channel的缩写.JSch是一个 ...
- Watir: Win32ole对于excel某些指令无法操作的时候有如下解决方案
Similar Threads 1. WIN32OLE - failed to create WIN32OLE 2. WIN32OLE#[] and WIN32OLE#[]= method in Ru ...
- vs2008打开类视图,看不到类的解决方法
去工程文件中删除ncb文件,重新打开工程
- HDU - 2828 网络流
题目大意 有n个灯,m个开关,由于线路乱接导致可能有多个开关对应一个灯(并联),有的灯在开关开的时候亮 有的灯在开关关的时候亮,[每个开关最多对应两盏灯],试找出一种开关的ON,OFF状态,使得所有灯 ...
- Two
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...