C# abstract ,virtual ,override,new --比较好的文章

本文详细解析了C#中override和new关键字的区别与应用场景,并通过示例代码展示了abstract、virtual与override之间的联系,帮助读者深入理解C#的多态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/notifier/archive/2010/05/14/1735235.html

 

1.  C#中方法覆盖时override和new的比较

     C#中override关键字使用在虚函数(virtual method)和抽象函数(abstract method)的覆盖上;

     C#中new关键字使用在派生类覆盖父类的"普通"函数上(也就是说非虚函数非抽象函数的情境下) 

     下面是代码示例:(override的用法见下面abstract和virtual比较的章节)

复制代码
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
publicabstractclass Book
{
publicvoid Introduce()
{
Console.WriteLine("I'm book");
}

publicvoid SayHi()
{
Console.WriteLine("Hi, I'm book");
}
}


publicclass JavaBook : Book
{
// 显式加上new,跟不加new实际效果一样,只是加new之后会消除compile warning
publicnewvoid SayHi()
{
Console.WriteLine("Hi, I'm Java");
}
}


publicclass test
{
public test()
{
JavaBook javaBook =new JavaBook();
Book book =new JavaBook();

javaBook.Introduce(); //将调用JavaBook中Introduce()
javaBook.SayHi(); //将调用JavaBook中SayHi()

book.Introduce(); //将调用Book中Introduce()
book.SayHi(); //将调用Book中SayHi()
}
publicstaticvoid Main()
{
test t =new test();
}
}
}
复制代码

 


 

2.  C#中abstract和virtual的比较

     abstract方法(抽象方法)和Java中的使用是一致的,至少我现在是这么理解.

     virtual是C#中为了实现运行时多态而加的机制,上面有提到,子类可以覆盖父类的函数(使用override)从而实现多态.

     这里岔个话题,笔记一下C#中多态的实现:C#中多态的实现分为了两种,一种是编译时多态,一种是运行时多态

         |- 编译时多态  通过一个类中多个方法的重载来实现的多态,系统在编译的时候,根据传递的参数确定具体调用哪个重载的方法;

         |- 运行时多态  通过virtual函数(虚函数)、抽象方法实现的多态,派生类去override虚函数或抽象方法,从而实现运行时多态.

     具体实例代码如下:

第一段代码: abstract的用法

复制代码
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
publicabstractclass Book
{
//抽象方法,不含主体,抽象方法所在类必须为抽象类,派生类必须实现该方法
publicabstractvoid Introduce();
}

publicclass JavaBook : Book
{
//实现抽象方法,必须实现,注意!必须添加override关键字
publicoverridevoid Introduce()
{
Console.WriteLine("I'm Java");
}
}


publicclass test
{
public test()
{
JavaBook javaBook =new JavaBook();
javaBook.Introduce(); //将调用JavaBook中Introduce()
Book book =new JavaBook();
book.Introduce(); //将调用JavaBook中Introduce()
}
publicstaticvoid Main()
{
test t =new test();
}
}
}
复制代码

第二段代码: virtual的用法以及override的用法

复制代码
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
publicabstractclass Book
{
publicvirtualvoid Introduce()
{
Console.WriteLine("I'm book");
}

publicvirtualvoid SayHi()
{
Console.WriteLine("Hi, I'm book");
}
}


publicclass JavaBook : Book
{
publicoverridevoid Introduce()
{
Console.WriteLine("I'm Java");
}

//注意,此方法没有override父类的方法
publicvoid SayHi()
{
Console.WriteLine("Hi, I'm Java");
}
}


publicclass test
{
public test()
{
JavaBook javaBook =new JavaBook();
Book book =new JavaBook();
javaBook.Introduce(); //将调用JavaBook中Introduce()
book.Introduce(); //将调用JavaBook中Introduce()

javaBook.SayHi(); //将调用JavaBook中SayHi()
book.SayHi(); //将调用Book中SayHi()
}

publicstaticvoid Main()
{
test t =new test();
}
}
}
复制代码

转载于:https://www.cnblogs.com/runliuv/archive/2013/03/22/2974945.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值