C#基础语法:Base关键字学习笔记
它与this关键字一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代而存在的,只不过this关键字用于替代本类的实例,base关键字用于替代基类的实例,用法很简单,其访问基类的形式如下:
base.【标识符】
base[【表达式列表】] 这个类型的一看便可以大概猜测多用于基类实例的索引器操作,在我下面演示的代码中你会看到它的用法。
对于 base.【标识符】的访问形式再次说明一下:
对于非虚方法,这种访问仅仅是对基类实例成员的直接访问,完全等价于((base)this).【标识符】。
对于虚方法,对于这种访子类重写该虚方法运用这种访问形式也是(禁用了虚方法调用的机制)对基类实例成员的直接访问,将其看做非虚方法处理,此时则不等价于((base)this).【标识符】,因为这种格式完全遵守虚方法调用的机制,其声明试时为积累类型,运行时为子类类型,所以执行的还是子类的重写方法。于未重写的虚方法等同于简单的非虚方法处理。
测试代码如下:
usingSystem;
namespaceBaseTest
{
classfather
{
stringstr1="thisfield[1]ofbaseclass",str2="thisfield[2]ofbaseclass";
publicvoidF1()//Non-virtualmethod
{
Console.WriteLine("F1ofthebaseclass");
}
publicvirtualvoidF2()//virtualmethod
{
Console.WriteLine("F2ofthebaseclass");
}
publicvirtualvoidF3()
{
Console.WriteLine("F3ofthebaseclassthatisnotoverrided");
}
publicstringthis[intindex]
{
set
{
if(index==1)
{
str1=value;
}
else
{
str2=value;
}
}
get
{
if(index==1)
{
returnstr1;
}
else
{
returnstr2;
}
}
}
}
classChild:father
{
publicvoidG()
{
Console.WriteLine("======Non-virtualmethodsTest=========");
base.F1();
((father)this).F1();
Console.WriteLine("======virtualmethodsTest=========");
base.F2();
((father)this).F2();
base.F3();
((father)this).F3();
Console.WriteLine("=====Testthetypethatthetbase[[expression]]==========");
Console.WriteLine(base[1]);
base[1]="overridethedefault";
Console.WriteLine(base[1]);
Console.WriteLine("================TestOver=====================");
}
publicoverridevoidF2()
{
Console.WriteLine("F2ofthesubclass");
}
staticvoidMain(string[]args)
{
Childchild=newChild();
child.G();
Console.ReadKey();
}
}
}
base用于构造函数声明,用法和this用于构造函数声明完全一致,但base是对基类构造函数形参的匹配。
usingSystem;
namespaceBaseCoTest
{
classBase
{
publicBase(inta,stringstr)
{
Console.WriteLine("Base.Base(inta,stringstr)");
}
publicBase(inta)
{
Console.WriteLine("Base.Base(inta)");
}
publicBase()
{
}
}
classSub:Base
{
publicSub()
{
}
publicSub(inta)
:base(1,"123")
{
Console.WriteLine("Sub.Sub(inta)");
}
classTest
{
publicstaticvoidMain()
{
Subsub=newSub(1);
Console.ReadKey();
}
}
}
}