您的位置:首页 > 编程语言 > C#

C#中的virtual与override学习笔记(摘自MSDN)

2009-12-04 10:23 316 查看
virtual(C#参考)

virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。

[align=center][/align]复制代码
publicvirtualdoubleArea()
{
returnx*y;
}

虚拟成员的实现可由派生类中的重写成员更改。有关使用virtual关键字的更多信息,请参见使用Override和New关键字进行版本控制(C#编程指南)和了解何时使用Override和New关键字(C#编程指南)。


备注

调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。

默认情况下,方法是非虚拟的。不能重写非虚方法。

virtual修饰符不能与staticabstract,privateoverride修饰符一起使用。

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

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

通过包括使用override修饰符的属性声明,可在派生类中重写虚拟继承属性。


示例

在该示例中,Dimensions类包含x和y两个坐标和Area()虚方法。不同的形状类,如Circle、Cylinder和Sphere继承Dimensions类,并为每个图形计算表面积。每个派生类都有各自的Area()重写实现。根据与此方法关联的对象,通过调用正确的Area()实现,该程序为每个图形计算并显示正确的面积。

在前面的示例中,注意继承的类Circle、Sphere和Cylinder都使用了初始化基类的构造函数,例如:

[align=center][/align]复制代码
publicCylinder(doubler,doubleh):base(r,h){}

这类似于C++的初始化列表。

[align=center][/align]复制代码
//cs_virtual_keyword.cs
usingSystem;
classTestClass
{
publicclassDimensions
{
publicconstdoublePI=Math.PI;
protecteddoublex,y;
publicDimensions()
{
}
publicDimensions(doublex,doubley)
{
this.x=x;
this.y=y;
}

publicvirtualdoubleArea() { returnx*y; }
}

publicclassCircle:Dimensions
{
publicCircle(doubler):base(r,0)
{
}

publicoverridedoubleArea()
{
returnPI*x*x;
}
}

classSphere:Dimensions
{
publicSphere(doubler):base(r,0)
{
}

publicoverridedoubleArea()
{
return4*PI*x*x;
}
}

classCylinder:Dimensions
{
publicCylinder(doubler,doubleh):base(r,h)
{
}

publicoverridedoubleArea()
{
return2*PI*x*x+2*PI*x*y;
}
}

staticvoidMain()
{
doubler=3.0,h=5.0;
Dimensionsc=newCircle(r);
Dimensionss=newSphere(r);
Dimensionsl=newCylinder(r,h);
//Displayresults:
Console.WriteLine("AreaofCircle={0:F2}",c.Area());
Console.WriteLine("AreaofSphere={0:F2}",s.Area());
Console.WriteLine("AreaofCylinder={0:F2}",l.Area());
}
}



输出
AreaofCircle=28.27
AreaofSphere=113.10
AreaofCylinder=150.80
override(C#参考)要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用override修饰符。

在此例中,类Square必须提供Area的重写实现,因为Area是从抽象的ShapesClass继承而来的。

[align=center][/align]复制代码[code]abstractclassShapesClass
{
abstractpublicintArea();
}

classSquare:ShapesClass
{
intx,y;
//BecauseShapesClass.Areaisabstract,failingtooverride
//theAreamethodwouldresultinacompilationerror.
publicoverrideintArea()
{
returnx*y;
}
}
有关override关键字用法的更多信息,请参见使用Override和New关键字进行版本控制以及了解何时使用Override和New关键字。


备注override方法提供从基类继承的成员的新实现。通过override声明重写的方法称为重写基方法。重写的基方法必须与override方法具有相同的签名。有关继承的信息,请参见继承。

不能重写非虚方法或静态方法。重写的基方法必须是virtualabstractoverride的。

override声明不能更改virtual方法的可访问性。override方法和virtual方法必须具有相同的访问级别修饰符。

不能使用修饰符newstaticvirtualabstract来修改override方法。

重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtualabstractoverride的。

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: