虚方法(virtual)和抽象方法(abstract)比较

在学习中遇到的这两个,他们都可以被重写,但是区别有哪些呢?

在网上搜索了一下,园子里有篇文章http://www.cnblogs.com/michaelxu/archive/2008/04/01/1132633.html

摘抄了下来:

1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。

2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。

 

再来看看msdn上的解释:

abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

抽象具有以下特性:

1、抽象类不能实例化。

2、抽象类可以包含抽象方法和抽象访问器。

3、不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。

4、从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

抽象方法具有以下特性:

1、抽象方法是隐式的虚方法。

2、只允许在抽象类中使用抽象方法声明。

3、因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。

4、实现由一个重写方法提供,此重写方法是非抽象类的成员。

5、在抽象方法声明中使用 static 或 virtual 修饰符是错误的。


除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样

1、在静态属性上使用 abstract 修饰符是错误的。

2、在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

抽象类必须为所有接口成员提供实现。

实现接口的抽象类可以将接口方法映射到抽象方法上。

 

 

//本人第一次在园子里发表,请大家别鸡蛋砸我哦。。

posted @ 2008-12-05 23:55  TomWang  阅读(544)  评论(2编辑  收藏  举报