重写基类
对于派生类,基类属性声明是合适的,但实现并非总是合适的。因此需要一种机制在派生类种使用自定义的实现来重写(override)基类中的实现
1、virtual修饰符
C#支持重写实例方法和属性,但不支持字段和静态成员的而重写。为进行重写,基类必须将允许重写的成员标记为virtual
public class PadItem { public virtual string Name { get; set; } } public class Contact : PadItem { public string FirstName { get; set; } public string LastName { get; set; } public override string Name { get { return $"{FirstName}{LastName}"; } set { string[] names = value.Split(' '); FirstName = names[0]; LastName = names[1]; } } }
若拿掉virtual则会报错,若拿掉override则会警告。
2、new修饰符
new修饰符在基类面前隐藏了派生类重新声明的成员。这时不是调用派生最远得成员,而是搜索继承链,找到使用new修饰符得那个成员之前的、派生得最远得成员,然后调用该成员。如继承链仅包含两个类,就使用基类的成员。若既没有指定override又没有指定new则默认为new。
public class BaseClass { public void Show() { Console.WriteLine("BaseClass"); } } public class DerivedClass : BaseClass { public virtual void Show() { Console.WriteLine("DerivedClass"); } } public class SubDerivedClass : DerivedClass { public override void Show() { Console.WriteLine("SubDerivedClass"); } } public class SuperSubDerivedClass : SubDerivedClass { public new void Show() { Console.WriteLine("SuperSubDerivedClass"); } }
SuperSubDerivedClass.Show()显示SuperSubDerivedClass,因为没有派生类了
SubDerivedClass.Show()是重写了基类虚成员的派生得最远的成员,使用了new修饰符的SuperSubDerivedClass.Show()被隐藏。
DerivedClass.Show()是虚方法,而SubDerivedClass.Show()是它派生得最远得成员。
BaseClass.Show()会直接调用。
不严谨得说,new操作符起到了一个截断继承链的作用。
3、构造函数
为防止因为缺少可访问的默认构造函数而造成错误,需要在派生类的构造函数的头部显式指定要运行哪个基类构造函数
public class Person { public string Name { get; set; } public Person(string name) { Name = name; } } public class Chinese : Person { public int Age { get; set; } public Chinese(string name,int age) : base(name) { Name = name; Age = age; } }