zoukankan      html  css  js  c++  java
  • 重写基类

    对于派生类,基类属性声明是合适的,但实现并非总是合适的。因此需要一种机制在派生类种使用自定义的实现来重写(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;
                }
            }
  • 相关阅读:
    Android开发日记(三)
    Android开发日记(二)
    Bundle savedInstanceState的作用
    Android Bundle类
    Consumer
    饭卡
    《CLR via C#》读书笔记 之 泛型
    WCF寄宿到Windows Service
    WCF中配置文件解析
    WCF Service Configuration Editor的使用
  • 原文地址:https://www.cnblogs.com/TheLin/p/14398140.html
Copyright © 2011-2022 走看看