美文网首页
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);
        }
    }

相关文章

  • Unity 面试题汇总(一)

    C#语言基础 1.重载和重写的区别 1) 封装、继承、多态所处位置不同,重载在同类中,重写在父子类中。 ...

  • 面向对象的基本原则

    基本要素: 封装 , 继承 , 多态 多态 : 注意重写和重载 重写: 子类重写父类的方法 重载: 同样的方法名 ...

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

    继承 继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。C# 和 ...

  • 继承、多态、重载和重写

    什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、...

  • 深入理解Java重载与重写

    我们都知道Java有三大宝,分别是:多态、封装、继承。其中多态主要体现就是重写与重载(有些人认为重载根本不属于多态...

  • 设计模式分享笔记

    围绕:设计、重构 理论基础 1.面向对象 分装、继承、多态 多态: 重载(对象内部,方法名相同、参数不同) 重写(...

  • iOS复习之重写与重载

    iOS面向对象的三大特征 封装、继承、多态 Swift-重写与重载的使用和比较

  • Java重载与重写

    简言 重写和重载都是面向对象多态的一种表现,重载是编译时多态,重载是运行时多态. 重载 重载(Overloadin...

  • 面试题(面试必答)

    方法重载 :不属于多态方法重写 :属于多态构造器: 构造器名称跟类名一样面向对象思想的三大特点:多态、封装、继承 ...

  • Android 3.22面试题

    1. 面向对象的三大特征 封装,继承,多态 2. 简述OverLoading(重载)和Override(重写)的区...

网友评论

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

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