重写基类

对于派生类,基类属性声明是合适的,但实现并非总是合适的。因此需要一种机制在派生类种使用自定义的实现来重写(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;
            }
        }

 

posted @ 2021-02-11 20:30  这总没有了吧  阅读(123)  评论(0编辑  收藏  举报