美文网首页
C# 继承、多态、重载、重写

C# 继承、多态、重载、重写

作者: 李霖弢 | 来源:发表于2019-09-30 16:09 被阅读0次

    继承

    继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。
    C# 和 .NET 不支持多重继承,也就是只能继承自一个类,但是继承可以传递。C#类始终继承自一个基类(如果未在声明中指定一个基类,则继承自System.Object)。
    可以使用接口来模拟多重继承。
    静态构造函数、实例构造函数、终结器 无法被继承。

    基类和派生类

    一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。

    class <派生类> : <基类>
    {
     ...
    }
    

    父类的构造函数会优先于子类执行。
    当采用 参数化构造函数 时,子类构造函数需继承父类。
    若子类中存在父类同名的方法/属性,则子类实例调用时优先用子类的(但不会导致父类的被覆盖),可以通过base访问父类的内容

        class Tabletop : Rectangle
        {
            public Tabletop(double l, double w) : base(l, w)
            { }
            public void Display()
            {
              Console.WriteLine(base.Display());
            }
        }
    

    多态 (静态重载 和 动态重写)

    多态是同一个行为具有多个不同表现形式或形态的能力。

    静态多态性中,在编译时发生
    • 函数重载
      同一个范围内相同的函数名可以有多个定义。函数参数列表中的参数类型和个数不能完全相同(具有唯一签名)。
    • 运算符重载
      重载运算符是具有特殊名称的函数,通过关键字 operator 后跟运算符的符号来定义,可以让运算符对某个类的实例生效,并自定义其运算规则。运算符必须为publicstatic
    public static Box operator+ (Box b, Box c)
    {
      Box box = new Box();
      box.length = b.length + c.length;
      box.breadth = b.breadth + c.breadth;
      box.height = b.height + c.height;
      return box;
    }
    
    动态多态性中,在运行时发生

    override关键字用于修改方法,具有override关键字修饰符的方法是对基类中同签名方法的新实现,基类中的同名方法必须声明为virtualabstract类型。给基类中的方法添加virtual关键字表示可以在派生类中重写它的实现。
    new、static和virtual关键字不能与override修饰符一同使用

    • 抽象类 abstract
      C# 允许使用关键字 abstract 创建抽象类。抽象类可以包含抽象方法(即不实现的方法),派生类必须实现基类的抽象方法。
      • 抽象类不能创建实例。
      • 抽象方法是没有实现代码的虚方法。只能在抽象类中声明,且不能被实现。必须在所有非抽象派生类中重写抽象方法。
      • 由于密封类 sealed 不能被继承,抽象类不能被声明为 sealed。
      • 和接口的区别:
        • a. 抽象类可以有构造方法,接口中不能有构造方法。
        • b. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
        • c. 抽象类中可以包含非抽象普通方法,接口中的所有方法必须都是抽象的。
        • d. 抽象类中的抽象方法的访问权限可以是 public、protected 和(默认类型,虽然 eclipse 不报错,但也不能用,默认类型子类不能继承),接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
        • e. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问权限可以是任意的,但接口中定义的变量只能是 public static final 类型的,并且默认即为 public static final 类型。
        • f. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
    using System;
    namespace InheritanceApplication
    {
        abstract class Father
        {
            public int num = 10;
            abstract public void Fun();
        }
        class Son : Father
        {
            public override void Fun()
            {
                Console.WriteLine(num);//10
            }
        }
        class FatherTester
        {
            static void Main(string[] args)
            {
                Son son = new Son();
                son.Fun();
                Console.ReadKey();
            }
        }
    }
    
    • 虚方法 visual
      当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法。
      • 虚方法在基类中必须有实现(哪怕是空的 {} )
      • 子类可以重写也可以不重写虚方法
    using System;
    namespace InheritanceApplication
    {
        class Father
        {
            public int num = 10;
            public virtual void Fun()
            {
                Console.WriteLine("执行基类");
            }
        }
        class Son : Father
        {
            public override void Fun()
            {
                Console.WriteLine(num);//10
            }
        }
        class FatherTester
        {
            static void Main(string[] args)
            {
                Father father = new Father();
                father.Fun();
                Son son = new Son();
                son.Fun();
                Console.ReadKey();
            }
        }
    }
    
    • 强制重写 new
      使用 new 可以直接强制重写基类中的同名方法。
      • 抽象方法不能通过new重写,必须override
      • 普通方法和虚方法都可以通过new重写
        class Son : Father
        {
            public new void Fun()
            {
                Console.WriteLine(num);
            }
        }
    

    相关文章

      网友评论

          本文标题:C# 继承、多态、重载、重写

          本文链接:https://www.haomeiwen.com/subject/fogiyctx.html