http://blog.csdn.net/zhoufoxcn/archive/2007/01/31/1498685.aspx
http://blog.csdn.net/zhoufoxcn/archive/2008/09/02/2864429.aspx
总结:
1、要实现Virtual方法就必须要使用override或new关键字(new和override产生的机理不同)。
2、New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方法(?不对吧,父类的只能声明成虚方法啊)和虚方法进行重写。
3、override 覆盖父类方法的前提是父类声明成virtual 类型的;
(
否则编译器报错,如下:
d:/Polymorphism.cs(182,30): error CS0506: “Operationjj.Sonclass.Method4()”:
继承成员“Operationjj.Fatherclass.Method4()”未被标记为
virtual、abstract 或 override,无法进行重写
d:/Polymorphism.cs(134,21): (与前一个错误相关的符号位置)
)
4、而当子类中用new时,无论父类是虚方法还是普通方法,都会隐藏父类方法。
参考:
1、http://hi.baidu.com/wildwithjoy/blog/item/e5f32cedae357ed0b31cb1f7.html
2、http://space.itpub.net/12639172/viewspace-512078
code:
***********************************************************
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace Operationjj
{
public class Polymorphism
{
static void Main(string[] args)
{
//创建一个Sonclass类的son对象
Sonclass son = new Sonclass();
//创建一个Fahterclass类的father对象
Fatherclass father = new Fatherclass();
//创建一个Fahterclass类的对象fs对象,但是用Sonclass类来实现,这种方式是允许的。
//意思就是父亲到儿子的房子去了,看到的油画应该是父亲的油画,房子还是从父亲那继承下的房子。
//对象fs所引用出的成员,实际是从父类中继承来的成员,不是继承来的成员(如儿子自己买的电器)fs是无权访问的。
//父类需要子类去实现的这种方式会在抽象类和接口中会用到
Fatherclass fs = new Sonclass();
//先观察一下子使用new的Method方法中三对象的结果
//--------------------------------------
//子类的对象 son 引用的Method方法打印的是子类的Mehtod方法
son.Method();
//子类的Method方法因为使用了new,只是覆盖了父类的Method方法,所以父类的对象fs引用的Method方法打印出来的还是从父类中继承 下来的Method方法
fs.Method();
//父类中的Method方法不变
father.Method();
Console.WriteLine("------------");
//先观察一下 子类使用override的Method1方法中三对象的结果
//-------------------------------------------------
//子类的对象 son 引用的Method1方法 打印出的是子类的Method1方法
son.Mehtod1();
//子类中的Method1方法,因为使用了override,重写了父类的Method1方法,
//所以父类的对象fs引用的Method1方法打印出的 还是从子类中继承下来的Mehtod1方法
//子类中 只存在子类的Method1方法,结果如下:
fs.Mehtod1();
//父类中的Method1方法不变
father.Mehtod1();
Console.WriteLine("-------------------");
//先观察一下 子类Sonclass使用override和base.method1的Method2方法中三对象的结果
//--------------
//因为使用了override,重写了父类的Method2方法
//因为使用了base.Method1,所以在子类中会调用父类的Method方法
//子类的对象son引用的Method1方法打印的是子类的Method2方法和父类的Method1方法
son.Method2();
//子类中的Mehtod2方法,因为使用了override,重写了父类的Method2方法,
//所以父类的对象fs引用的Method2方法打印出的是还是从子类中继承下来的Method2方法
//子类中 只存在子类的Method2方法,结果如下:
fs.Method2();
//父类中的Method2方法不变
father.Method2();
Console.WriteLine("------------------");
son.Method3();
fs.Method3();
father.Method3();
son.Method4();
fs.Method4();
father.Method4();
}
}
class Fatherclass
{
//定义一个公有的Method方法,子类中用new隐藏本方法
public void Method()
{
Console.WriteLine("我是父类中的公有Method方法");
Console.WriteLine();
}
// 定义一个虚方法Method1,子类中重写Method1
public virtual void Mehtod1()
{
Console.WriteLine("我是父类中的虚方法Method1");
Console.WriteLine();
}
public virtual void Method2()
{
Console.WriteLine("我是父类中的虚方法Method2");
Console.WriteLine();
}
//定义一个公有的Method3,子类中用new隐藏本方法
public virtual void Method3()
{
Console.WriteLine("我是父类中的公有的方法Method3");
Console.WriteLine();
}
//定义一个非虚方法Method4,子类中用override覆盖本方法
public virtual void Method4()
{
Console.WriteLine("我是父类中的虚方法Method4");
Console.WriteLine();
}
}
class Sonclass : Fatherclass
{
//定义一个公有Method方法,隐藏了父类的Mehtod方法
public new void Method()
{
Console.WriteLine("我是子类中的Mehtod方法,使用new关键字,显式地隐藏父类的同名virtual方法");
Console.WriteLine();
}
//定义一个重写父类Method1的方法Method1
public override void Mehtod1()
{
Console.WriteLine("我是子类中的Mehtod1方法,覆盖父类中的virtual同名方法,此时 Sonclass中没有了父类中的Method1方法");
Console.WriteLine();
}
//定义一个重写父类Method2的方法Mehtod2,同时使用base调用父类的Method2
public override void Method2()
{
Console.WriteLine("我是子类中的Method2,覆盖父类中的同名virtual方法,调用base.method1");
base.Mehtod1();
Console.WriteLine();
}
//定义一个公有Method3方法,隐藏了父类的Mehtod3方法
public new void Method3()
{
Console.WriteLine("我是子类中的Mehtod3方法,使用new关键字,显式地隐藏父类的同名公有方法");
Console.WriteLine();
}
//定义一个重写父类Method4的方法Method4
public override void Method4()
{
Console.WriteLine("我是子类中的Mehtod4方法,覆盖父类中的同名virtual方法,此时 Sonclass中没有了父类中的Method4方法");
Console.WriteLine();
}
}
}
*************************************************************
result:
****************************************************************
C:/>csc d:/Polymorphism.cs
Microsoft (R) Visual C# 2005 编译器 版本 8.00.50727.42
用于 Microsoft (R) Windows (R) 2005 Framework 版本 2.0.50727
版权所有 (C) Microsoft Corporation 2001-2005。保留所有权利。
C:/>Polymorphism.exe
我是子类中的Mehtod方法,使用new关键字,显式地隐藏父类的同名virtual方法
我是父类中的公有Method方法
我是父类中的公有Method方法
------------
我是子类中的Mehtod1方法,覆盖父类中的virtual同名方法,此时 Sonclass中没有了父类
中的Method1方法
我是子类中的Mehtod1方法,覆盖父类中的virtual同名方法,此时 Sonclass中没有了父类
中的Method1方法
我是父类中的虚方法Method1
-------------------
我是子类中的Method2,覆盖父类中的同名virtual方法,调用base.method1
我是父类中的虚方法Method1
我是子类中的Method2,覆盖父类中的同名virtual方法,调用base.method1
我是父类中的虚方法Method1
我是父类中的虚方法Method2
------------------
我是子类中的Mehtod3方法,使用new关键字,显式地隐藏父类的同名公有方法
我是父类中的公有的方法Method3
我是父类中的公有的方法Method3
我是子类中的Mehtod4方法,覆盖父类中的同名virtual方法,此时 Sonclass中没有了父类
中的Method4方法
我是子类中的Mehtod4方法,覆盖父类中的同名virtual方法,此时 Sonclass中没有了父类
中的Method4方法
我是父类中的虚方法Method4
C:/>
*********************************************************************