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

继承

继承是面向对象的编程的一种基本特性。 借助继承,能够定义可重用(继承)、扩展或修改父类行为的子类。
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);
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • C++ 继承 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个...
    苏州韭菜明阅读 3,193评论 0 5
  • 继承和多态 1. 继承的优缺点 优点:(1)子类可以灵活地改变父类中的已有方法;(2)能够最大限度的实现代码重用。...
    MinoyJet阅读 603评论 0 0
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 1,125评论 0 5
  • 正直年少, 青春正好。 请以梦为马, 请挂梦扬帆。 不论岁月如何负我, 我既如何负了岁月。 只念经历过, 开心快乐...
    素絢阅读 167评论 0 1
  • Lecture 1:The Learning Problem machine learning: improvin...
    岸左雨竹阅读 347评论 0 0