C#中的virtual与override学习笔记(摘自MSDN)
2009-12-04 10:23
316 查看
virtual(C#参考)
virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
[align=center][/align]复制代码
虚拟成员的实现可由派生类中的重写成员更改。有关使用virtual关键字的更多信息,请参见使用Override和New关键字进行版本控制(C#编程指南)和了解何时使用Override和New关键字(C#编程指南)。
备注
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual修饰符不能与static、abstract,private或override修饰符一起使用。
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
在静态属性上使用virtual修饰符是错误的。
通过包括使用override修饰符的属性声明,可在派生类中重写虚拟继承属性。
示例
在该示例中,Dimensions类包含x和y两个坐标和Area()虚方法。不同的形状类,如Circle、Cylinder和Sphere继承Dimensions类,并为每个图形计算表面积。每个派生类都有各自的Area()重写实现。根据与此方法关联的对象,通过调用正确的Area()实现,该程序为每个图形计算并显示正确的面积。
在前面的示例中,注意继承的类Circle、Sphere和Cylinder都使用了初始化基类的构造函数,例如:
[align=center][/align]复制代码
这类似于C++的初始化列表。
[align=center][/align]复制代码
输出
使用Override和New关键字进行版本控制以及了解何时使用Override和New关键字。
备注override方法提供从基类继承的成员的新实现。通过override声明重写的方法称为重写基方法。重写的基方法必须与override方法具有相同的签名。有关继承的信息,请参见继承。
不能重写非虚方法或静态方法。重写的基方法必须是virtual、abstract或override的。
override声明不能更改virtual方法的可访问性。override方法和virtual方法必须具有相同的访问级别修饰符。
不能使用修饰符new、static、virtual或abstract来修改override方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。
[/code]
virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。
[align=center][/align]复制代码
publicvirtualdoubleArea() { returnx*y; }
虚拟成员的实现可由派生类中的
备注
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
virtual修饰符不能与static、abstract,private或override修饰符一起使用。
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
在静态属性上使用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修饰符。有关override关键字用法的更多信息,请参见
在此例中,类Square必须提供Area的重写实现,因为Area是从抽象的ShapesClass继承而来的。[align=center][/align]复制代码[code]abstractclassShapesClass
{
abstractpublicintArea();
}
classSquare:ShapesClass
{
intx,y;
//BecauseShapesClass.Areaisabstract,failingtooverride
//theAreamethodwouldresultinacompilationerror.
publicoverrideintArea()
{
returnx*y;
}
}
备注override方法提供从基类继承的成员的新实现。通过override声明重写的方法称为重写基方法。重写的基方法必须与override方法具有相同的签名。有关继承的信息,请参见
不能重写非虚方法或静态方法。重写的基方法必须是virtual、abstract或override的。
override声明不能更改virtual方法的可访问性。override方法和virtual方法必须具有相同的
不能使用修饰符new、static、virtual或abstract来修改override方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。
[/code]
相关文章推荐
- C#对 Windows 窗体控件进行线程安全调用 摘自MSDN
- Constraints on Type Parameters (C# Programming Guide) --摘自MSDN
- C#泛型类型里的反引号(`),摘自MSDN
- c#中的虚拟方法-virtual(转自MSDN)
- c#中的虚拟方法-virtual(转自MSDN)
- TcpClient类的使用,摘自MSDN-c#
- TcpClient类的使用,摘自MSDN-c#
- 自动实现的属性(C# 编程指南)(摘自MSDN)
- 创建和使用c#DLL(摘自MSDN)
- C#操作IIS(摘自CSDN上Terry著)
- 关于C#的virtual,Override和new的坑
- C++ 可变形参 用法示例[摘自MSDN]
- C# 自定义异常类型(摘自CLR Via C# 3th Edition)
- c# abstract 和 virtual
- virtual (c#参考)
- c#中的interface abstract 与 virtual(转)
- C#虚方法virtual详解
- C#中Abstract和Virtual
- Cache.Insert 方法(摘自MSDN)
- C#基础知识系列七(base、this、new、override、abstract、virtual、static)