• .net系统自学笔记——继承


    继承

    1.继承的类型

    2.实现继承

    3.访问修饰符

    4.接口

    一、继承的类型:

    1.实现继承和接 口继承

    在面向 对象的 编程中,有两种截然不同的继承类型:实 现继承和接口 继承。

    • 实现继承:表示一个类型派生于一个基类型,它拥有该基类型的 所有成员字段和函 数。 在实现继承中,派 生类型采用基类型的 每个函数的实现代码,除 非在派生类型的定义中 指定重写某个函 数的 实现代码。 在需要给现有的 类型添加功能,或许多相关的 类型共享一组重要的公共功能时,这 种类型的继承非常有用。
    • 接口 继承:表示一个类型只继承了函 数的 签名,没 有继承任何实现代码。 在需要指定该类型具有某些可用的 特性时,最好使用这种类型的 继承。唧 支持实现继承和接 口 继承。 它们都内 置于语言和架构中,因 此可以 根据应用程序的 体系结构选择合适的继承。

    2.多重继承

    C#不支持多重实现继承。 而C#又允许类型派生自 多个接 口——多重接口 继承。 这说明,C# 可以 派生自 另一个类和任意多 个接口 。更准确地说,因 为System.Object是 一个公共的 基类,所 以 每个 C#类除了(除了Object类之外)都 有一个基类,还可以 有任意多个基接 口。

    3.结构和类

    结构总是派生自System.ValueType,不支持继承,但可以实现任意多个接口

    类总是派生自用户选择的另一个类,它们还可以活生生自任意多个接口。

    二、实现继承:

    语法:在新建类的类名/结构名,后跟【:】+ 基类名或接口名,如果有多个,可用【,】分隔

    C#不支持私有继承

    1.虚方法 :

    如果基类函数声明为virtual,可以在任何派生类中重写该函数。也可以把基类属性声明为virtual,派生类中也可重写。在调用方法时,会调用该类对象的合适方法 。C#中函数默认情况下不是虚拟的,除非virtual关键字进行显式声明(而在JAVA中,所有函数都是虚拟的)C#要求在派生类的函数重写另一个函数时,要使用override关键字进行显式声明。

    成员字段和静态都不能声明为virtual,因为这个概念只对类中的实例函数成员有意义。

    2.隐藏方法:如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有分别声明为virtual和override,派生类方法就会隐藏基类方法。C#中要隐藏一个方法应使new关键字声明。

    3.调用函数的基类版本:从派生类中调用基类方法:base.<方法名>()

    4.抽象类和抽象函数:C#允许把类和函数声明为abstract。抽象类不能实例化,抽象方法不能直接实现,必须在非抽象的派生类中重写。所以抽象函数本身也是虚拟的,尽管没有virtual关键字。如果类包含抽象函数,则该类也是抽象的,也必须声明为抽象的。

    5.密封类和密封方法:C#允许把类和方法声明为sealed。对于类,表示不能被继承,对于方法,表示不能被重写。要在方法或属性上使用seded关键字,必须先从基类上把它声明 为要重写的 方法或属性。 如果基类上不希望有重写的方法或属性,就不要把它声明为 叫virtual。

    6.派生类的构造函数:

    基类,派生类,构造函数的执行顺序:总是最先执行根其类的构造函数,再从上向下,执行编译器要实例化的类为止。如何调用基类的构造函数:子类构造函数名():base(){}

    base,this关键字是调用另一个构造函数时允许使用的唯一关键字。this代表当前实例

    三、修饰符

    1.可见性修饰符:public,protected,internal,private,protected internal

    不能把类型定义为protected、private,protected internal ,因为这些修饰符对于包含在名称空间中的 类型没有意义。 因 此这些修饰符只能 应用于成员。 但是,可 以 用这些修饰符定义嵌套的 类型 即,包含在 其他类型中的类型) ,因 为在这 种情况下,类 型也具有成员的 状态。

    2.其他修饰符:new,static,virtual,abstract,override,sealed,extern(似应用于静态方法,外部用另一种语言实现)

    可以应用于类型的成员,而且有不同的用途。在应用于类型时,其中的几个修饰符也是有意义的。

    四、接口

    声明接口在语法上与声明抽象类完全相同,但不允许提供接口中任何成员的实现方式。一般情况下,接口只能包含方法,属性,索引器和事件的声明。不能实例化接口,它只能包含其成员的签名,接口既不能有构造函数也不能有字段。接口定义也不允许包含运算符重载。在接口定义中还不允许声明关于成员的修饰符。接口成员总是公有的,不能声明为虚拟或静态。如果需要,就应由实现的类来声明,因此最好实现执行的类来声明访问修饰符。

    (一)、接口的定义和实现:

    1.声明:关键字:Interface。接口的命名通常以大写的I开头

    2.实现:也类继承的方式相同,可以与类的继承同时存在:在类名后加【:】+接口名

             派生类必须实现基类的所有方法

    3.派生类的使用,新建对象

    (二)、派生的接口

    接口可以彼此继承,其方式与类的继承方式相同

  • 相关阅读:
    Linux下查看使用的是哪种shell的方法汇总【转】
    Shell中的while循环【转】
    shell浅谈之三for、while、until循环【转】
    cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】
    Linux makefile 教程 非常详细,且易懂【转】
    链表常见的问题【转】
    linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】
    linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
    关于hrtimer_forward小段代码的分析【转】
    CTP多点触摸协议【转】
  • 原文地址:https://www.cnblogs.com/gdx4430090/p/3164355.html
Copyright © 2020-2023  润新知