C#基础语法:Base关键字学习笔记
程序员文章站
2023-12-01 15:49:04
它与this关键字一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代而存在的,只不过this关键字用于替代本类的实例,base关键字用于替代基类的实...
它与this关键字一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代而存在的,只不过this关键字用于替代本类的实例,base关键字用于替代基类的实例,用法很简单,其访问基类的形式如下:
base.【标识符】
base[【表达式列表】] 这个类型的一看便可以大概猜测多用于基类实例的索引器操作,在我下面演示的代码中你会看到它的用法。
对于 base.【标识符】的访问形式再次说明一下:
对于非虚方法,这种访问仅仅是对基类实例成员的直接访问,完全等价于((base)this).【标识符】。
对于虚方法,对于这种访子类重写该虚方法运用这种访问形式也是(禁用了虚方法调用的机制)对基类实例成员的直接访问,将其看做非虚方法处理,此时则不等价于((base)this).【标识符】,因为这种格式完全遵守虚方法调用的机制,其声明试时为积累类型,运行时为子类类型,所以执行的还是子类的重写方法。于未重写的虚方法等同于简单的非虚方法处理。
测试代码如下:
using system; namespace basetest { class father { string str1 = "this field[1] of baseclass", str2 = "this field[2] of baseclass"; public void f1() //non-virtual method { console.writeline(" f1 of the baseclass"); } public virtual void f2()//virtual method { console.writeline(" f2 of the baseclass"); } public virtual void f3() { console.writeline(" f3 of the baseclass that is not overrided "); } public string this[int index] { set { if (index==1 ) { str1 = value; } else { str2 = value; } } get { if (index ==1) { return str1; } else { return str2; } } } } class child:father { public void g() { console.writeline("======non-virtual methods test ========="); base.f1(); ((father)this).f1(); console.writeline("======virtual methods test========="); base.f2(); ((father)this).f2(); base.f3(); ((father)this).f3(); console.writeline("=====test the type that the tbase [[expression]] =========="); console.writeline(base[1]); base[1] = "override the default "; console.writeline(base[1]); console.writeline("================test over====================="); } public override void f2() { console.writeline(" f2 of the subclass "); } static void main(string[] args) { child child=new child(); child.g(); console.readkey(); } } }
base用于构造函数声明,用法和this用于构造函数声明完全一致,但base是对基类构造函数形参的匹配。
using system; namespace basecotest { class base { public base(int a, string str) { console.writeline("base. base(int a,string str)"); } public base(int a) { console.writeline("base. base(int a)"); } public base() { } } class sub : base { public sub() { } public sub(int a) : base(1, "123") { console.writeline("sub .sub(int a)"); } class test { public static void main() { sub sub = new sub(1); console.readkey(); } } } }
上一篇: C#流类FileStream学习使用笔记
下一篇: C#给文字换行的小技巧