本帖最后由 刘景发 于 2011-11-22 00:32 编辑
楼上回答的很好,简单明了,并带有例子。我在这把详细的区别贴出来,不过是我以前转别人博客收藏下来的,请楼主参考下!:)
用法可以简单描述成这样:
//抽象方法
public abstract class Animal
{
public abstract void Sleep();
public abstract void Eat();
}
//虚方法
public class Animal
{
public virtual void Sleep(){}
public virtual void Eat(){}
}
一、Virtual(虚拟):
1.修饰方法、属性、索引器或事件声明
2.允许在派生类中重写这些对象。说明:派生类可以重写这些方法,也可以不重写这些方法
3.修饰方法时注意:(可以有方法体)
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。
4.虚拟属性的行为与抽象方法一样。
在静态属性上使用 virtual 修饰符是错误的。
通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。
二、Abstract(抽象):
1.修饰类、方法、属性、索引器及事件
2.在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。
3.标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。说明:派生类必须实现
4.抽象类具有以下特性:
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用 sealed(C# 参考)修饰符修改抽象类,这意味着抽象类不能被继承。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
5.抽象方法具有以下特性:(没有方法体)
· 抽象方法是隐式的虚方法。
· 只允许在抽象类中使用抽象方法声明。
· 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签后 没有大括号 ({ })。例如: public abstract void MyMethod();
实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。
· 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
6.抽象属性的行为与抽象方法一样。
· 在静态属性上使用 abstract 修饰符是错误的。
在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
|