示例:
using System;
namespace Test
{
public class Person
{
protected string phone;
protected string name;
public string Name { get { return name; }}
public string Phone { get { return phone;}}
public Person(string _name)
{
name=_name;
}
public Person(string _name,string _phone)
{
phone=_phone;
name=_name;
}
}
class Employee : Person
{
public string id="ABC567EFG";
public Employee(string sname,string sphone,string sid)
: base(sname,sphone)
{
id=sid;
}
}
class Program
{
static void Main(string [] args)
{
Employee e=new Employee("李四","45999229","ABC567EFF");
Console.WriteLine("Name:{0}",e.Name);
}
}
}
如上,当用new操作符创建子类实例时,系统会自动调用和base后面参数列表相匹配的父类构造方法创建父类实例。子类如果没有使用base关键字,那么就相当于使用了“base()”,所以将调用父类不带参数的构造方法。base后面的参数列表可以包含常数或跟它相关联的子类构造方法参数列表中的参数。如在上面示例中,我们将base后面的一个参数换成子类的id成员字段就会产生编译错误:
class Employee : Person
{
public string id="ABC567EFG";
public Employee(string sname,string sphone,string sid)
: base(id,sphone)
{
id=sid;
}
}
我们再来看一下base关键字调用父类其他成员的情况,用base关键字调用的基类成员必须是子类继承过来的非私有成员,包括字段、属性、方法等,调用方式是:
base.基类成员
如下面这个例子:
using System;
namespace Test
{
public class Person
{
protected string name;
public string Name { get { return name;}}
public Person(string _name)
{
name=_name;
}
public void ShowName()
{
Console.WriteLine("name={0}",name);
}
}
class Employee : Person
{
public string id;
public Employee(string sname,string sid):base(sname)
{
id=sid;
}
public void Show()
{
base.ShowName();
Console.WriteLine("name={0}",base.name);
Console.WriteLine("id={0}",id);
}
}
class Program
{
static void Main(string [] args)
{
Employee e=new Employee("李四","ADFFFFDOD");
e.Show();
}
}
}
我们在子类的Show方法里使用了“base.ShowName()”语句调用基类的ShowName方法,使用了“base.name”访问基类name成员。不过此时你会发现,你把base关键字去掉或者把base关键字换成this关键字也会有同样的结果,如“this.ShowName()”和“this.name”。this关键字是调用本类成员的关键字。从这里可以看出,继承来的数据或方法(只有抽象或虚拟方法例外)跟自己的没什么不同,这和继承财产很相似。
this关键字——用来调用本类成员
我们使用this关键字可以调用本类的成员。实际上系统设置这个this关键字是为了方便你写代码。当你在类的方法里写入this关键字,然后打一个点的时候,系统就会把本类所有能调用的非静态方法都显示出来让你选择,此时,你就没有必要去记那些繁杂的方法或字段名了,这属于智能提示的范畴。要注意的是,this只能引用非静态成员,我们知道静态成员(静态方法、属性、索引器)是用类名引用的。除此之外,this关键字还可以调用自己的构造方法,规则和base关键字一样。另外要注意,this关键字只能用在方法、属性、索引器的代码中,不能在构造、析构方法内部使用。我们将上面的例子稍微改动一下,注意,在子类当中我们使用this关键字调用了自身的另一个构造方法:
using System;
namespace Test
{
public class Person
{
protected string name;
public string Name { get { return this.name; }}
public Person(string name)
{
this.name=name;
}
public void ShowName()
{
Console.WriteLine("name={0}",this.name);
}
}
class Employee : Person
{
public string id;
public Employee()
: this("李四","ADFFFFDOD")
{ }
public Employee(string sname,string sid)
: base(sname)
{
this.id=sid;
}
public void Show()
{
this.ShowName();
Console.WriteLine("name={0}",this.name);
Console.WriteLine("id={0}",id);
}
}
class Program
{
static void Main(string [] args)
{
Employee e=new Employee();
e.Show();
}
}
}
这个例子和上面那个例子结果完全相同。在这个例子当中,我们使用子类的默认构造方法创建了子类对象。但是,我们在此子类的无参构造方法后面使用this关键字调用了子类的另外一个带参的构造方法,所以说子类这两个构造方法都被调用了。因为在子类带参的构造方法中使用了base关键字,所以基类将使用此base关键字规定的构造方法创建对象。