黑马程序员技术交流社区

标题: base关键字 [打印本页]

作者: 赵鹏程    时间: 2012-6-18 16:21
标题: base关键字
base 关键字的用法(前些时间碰到,最近考试,刚想起来这个问题)
作者: 平建    时间: 2012-6-18 16:37
它与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();
            }
        }
    }
}
作者: 黑马龙超    时间: 2012-6-18 19:49
本帖最后由 黑马龙超 于 2012-6-18 19:54 编辑

一种情况是:
base表示基类的一个引用,同this相似,this为本类的引用
通过 base.成员 可以在子类中显式的访问基类的成员,这里的成员仅限于实例的
当然这种情况一般出现在父类的成员被子类的成员隐藏而又需要访问父类的成员时
此时,除非迫不得已要这么用,那么请考虑你的类设计是否合理

第二种情况是:
base出现在子类的构造函数参数的后面:base(参数)
显式表示先调用父类某个的构造函数

作者: 程艳伟    时间: 2012-7-2 11:46
base可以在子类中直接调用父类的方法
作者: 许庭洲    时间: 2012-7-2 16:38
1,C#中base关键字代表父类,使用base关键字可以调用父类的构造函数、属性和方法;
2,base()调用父类构造函数时,不需要再次指定参数的类型;
3,由于子类中已经定义了这些参数,在base()中只需指定变量名即可,参数的类型必须和父类中的一致。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2