base保留字 从派生类中访问基类的成员

base关键字,用于从派生类中访问基类的成员。换言之,是用来“访问基类的”

调用基类上已被其他方法重写的方法。

指定创建派生类实例时应调用的基类构造函数。  

base使用通用规则:

尽量少用或者不用base和this。除了避开子类的名称冲突和在一个构造函数中调用其他的构造函数之外,base和this的使用容易引起不必要的结果。

在静态成员中使用base和this都是不允许的。原因是,base和this访问的都是类的实例,也就是对象,而静态成员只能由类来访问,不能由对象来访问。 this是对实例的引用,而静态成员不属于实例而是属于类的,所以是不允许的。

base是为了实现多态而设计的。 
   使用this或base关键字只能指定一个构造函数,也就是说不可同时将this和base作用在一个构造函数上。

⑤简单的来说,base用于在派生类中访问重写的基类成员;而this用于访问本类的成员,当然也包括继承而来公有和保护成员。

除了base,访问基类成员的另外一种方式是:显示的类型转换来实现。只是该方法不能为静态方法。

条,参见下面的程序:

// keywords_base.cs
// Accessing base class members
using System;
public class Person
{
    protected string ssn = "444-55-6666";
    protected string name = "John L. Malgraine";

    public virtual void GetInfo()
    {
        Console.WriteLine("Name: {0}", name);
        Console.WriteLine("SSN: {0}", ssn);
    }
}
class Employee : Person
{
    public string id = "ABC567EFG";
    public override void GetInfo()
    {
        // Calling the base class GetInfo method:
        base.GetInfo();
        Console.WriteLine("Employee ID: {0}", id);
    }
}

class TestClass
{
    static void Main()
    {
        Employee E = new Employee();
        E.GetInfo();
    }
}

对象E,其方法GetInfo访问了基类的方法base.GetInfo();从而对基类中已经被重写的方法进行了调用。

条,参见下面的程序:

// keywords_base2.cs
using System;
public class BaseClass
{
    int num;

    public BaseClass()
    {
        Console.WriteLine("in BaseClass()");
    }

    public BaseClass(int i)
    {
        num = i;
        Console.WriteLine("in BaseClass(int i)");
    }

    public int GetNum()
    {
        return num;
    }
}

public class DerivedClass : BaseClass
{
    // This constructor will call BaseClass.BaseClass()
    public DerivedClass() : base()
    {
    }

    // This constructor will call BaseClass.BaseClass(int i)
    public DerivedClass(int i) : base(i)
    {
    }

    static void Main()
    {
        DerivedClass md = new DerivedClass();
        DerivedClass md1 = new DerivedClass(1);
    }
}

在这里,对于派生类的构造函数,可以直接用“public DerivedClass(int i) : base(i)”的方式进行指定,base中只写变量的名称,如果函数体中还有代码,则是执行完基类的构造函数后,继续往下执行的部分,所以,在处理参数的时候,要分两部分处理,一部分是给基类的构造函数,一部分是给剩下的函数体的,参看下面的代码:

using System;
class BaseClass
{
    protected BaseClass(string a)
    {
        Console.WriteLine("产生参数 {0} ",a);
    }
}
class Derivcedclass:BaseClass
{
    public Derivcedclass(string k,string d):base(k)
    {
        Console.WriteLine("产生参数{0}",d);
    }
}

class Test
{

    static void Main()
    {
        Derivcedclass test = new Derivcedclass("Wuxinhong", "Pengyao");
    }

}

在创建类的对象时,一共有两个参数,"Wuxinhong", "Pengyao",其传到基函数 public Derivcedclass(string k,string d):base(k),而参数k传递到了所继承的基类的基函数,余下的d 则传递到了函数体中,这充分说明了:

base可以在派生类的构造函数中,起一个指定的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值