欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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();
      }
    }
  }
}