1.virtual关键字
在C#中virtual关键字可以修饰方法,属性,索引器或者事件声明,并且允许在派生类中重写这些对象。(重写和重载的区别?重写是子类继承父类的方法的时候 ,重写了父类中的方法,其中子类的方法名和参数与父类完全一样,只不过方法体重写了而已。重载指的是在同一个类中,有多个方法名相同,但是参数类型或者个数不一样的方法,当然方法体也不会相同,最常见是构造函数的重载)
例如,定义了一个方法
public virtual double Area()
{
return x*y;
}
任何继承了该类的子类都可以重写这个方法,因为它用了virtual关键字来修饰。
虚拟成员的实现可由派生类中的重写成员更改。调用虚拟方法时,将为重写成员检查该对象的运行时的类型。将调用该派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的,不能重写非虚拟的方法。
virtual不能与static,abstract,private或者override修饰符一起使用。
很显然static方法只能被继承,不能被重写。
如果子类要重写虚拟方法或者属性,可以通过override修饰符进行声明。
下面是一个示例,看了以后应该就很容易明白虚拟方法了。
class Dimensions
{
public const double PI=Math.PI;
private double x,y;
public Dimensions()
{
}
public Dimensions()
{
this.x=x;
this.y=y;
}
public virtual double Area()
{
return x*y;
}
}
public class Circle:Dimensions
{
public Circle(double r):base(r,0)
{
}
public override double Area()
{
return PI*x*x;
}
}
class Cylinder:Dimensions
{
public Cylinder(double r, double h):base(r,h)
{
}
public override double Area()
{
return 2*PI*x*x+2*PI*x*y;
}
}
class test
{
static void Main()
{
double r=3,h=5;
Dimensions c=new Circle(r);
Dimensions l=new Cylinder(r,h);
……}
}
2.base关键字
我的理解base类似于java中的super,具体可参考这篇文章http://blog.csdn.net/xxjoy_777/article/details/39504273
3.IQueryable关键字,具体参见这篇文章:http://blog.csdn.net/xxjoy_777/article/details/39476263