C#的base关键字的用法
以下是 base 关键字的一些常见用法:
1. 访问基类的字段和属性
当派生类与基类有同名的字段或属性时,可以使用 base 关键字来明确指定访问基类中的成员。
public class BaseClass
{
public int MyProperty { get; set; }
}
public class DerivedClass : BaseClass {
new public int MyProperty { get; set; } // 隐藏基类的 MyProperty
public void ShowProperties()
{
Console.WriteLine("Base MyProperty: " + base.MyProperty); // 访问基类的 MyProperty
Console.WriteLine("Derived MyProperty: " + this.MyProperty); // 访问派生类的 MyProperty
}
}在这个例子中,DerivedClass 隐藏了 BaseClass 中的 MyProperty 属性。通过使用 base.MyProperty,我们可以访问基类中的 MyProperty 属性。
在派生类的构造函数中,可以使用 base 关键字来调用基类的构造函数。这对于确保基类得到正确的初始化非常有用。
public class BaseClass
{
public BaseClass(int value)
{
// 基类的初始化代码
}
}
public class DerivedClass : BaseClass
{
public DerivedClass(int value) : base(value)
{
// 派生类的初始化代码
}
}
在这个例子中,DerivedClass 的构造函数通过 base(value) 调用了 BaseClass 的构造函数。
如果派生类重写了基类的方法(使用 override 关键字),并且你需要在派生类的方法内部调用基类版本的该方法,可以使用 base 关键字。
public class BaseClass
{
public virtual void DoSomething()
{
Console.WriteLine("Doing something in BaseClass.");
}
}
public class DerivedClass : BaseClass
{
public override void DoSomething()
{
base.DoSomething(); // 调用基类版本的 DoSomething 方法
Console.WriteLine("Doing something additional in DerivedClass.");
}
}
假设基类定义了一个事件,派生类可能想要触发这个事件,或者在自己的事件处理逻辑中调用基类的事件处理器。这可以通过使用base关键字和事件名称来完成。
public class BaseClass
{
// 基类定义了一个事件
public event Action MyEvent;
protected virtual void OnMyEvent()
{
MyEvent?.Invoke();
}
}
public class DerivedClass : BaseClass
{
// 派生类可以触发基类的事件
public void TriggerBaseEvent()
{
base.OnMyEvent(); // 调用基类的事件触发方法
}
}
class Program
{
static void Main()
{
DerivedClass derived = new DerivedClass();
derived.MyEvent += () => Console.WriteLine("BaseClass event triggered from DerivedClass.");
derived.TriggerBaseEvent(); // 输出:BaseClass event triggered from DerivedClass.
}
}
索引器允许对象像数组一样进行索引。如果基类定义了一个索引器,派生类可以通过base关键字来访问它。
public class BaseClass
{
private int[] _values = new int[10];
// 基类定义了一个索引器
public int this[int index]
{
get { return _values[index]; }
set { _values[index] = value; }
}
}
public class DerivedClass : BaseClass
{
// 派生类可以访问基类的索引器
public void AccessBaseIndexer(int index, int value)
{
base[index] = value; // 使用base关键字访问基类的索引器
}
}
class Program
{
static void Main()
{
DerivedClass derived = new DerivedClass();
derived.AccessBaseIndexer(0, 42); // 设置基类的索引器值
Console.WriteLine(derived[0]); // 输出:42
}
}
在这个例子中,BaseClass定义了一个索引器,允许通过整数索引来访问和设置私有数组_values中的值。DerivedClass通过base[index]来访问和设置基类索引器的值。