C#语法手册

类及泛型类的继承


继承是面向对象的编程语言的一项功能,可方便你定义提供特定功能(数据和行为)的基类,并定义继承或重写此功能的派生类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSGDemo.CSG007
{
    //https://docs.microsoft.com/zh-cn/dotnet/csharp/tutorials/inheritance

    public class BaseClass { }

    public interface SampleInterface { }

    public interface SampleInterface2 { }

    //#csg007-01
    //在 C# 中仅允许单一继承。 也就是说,一个类仅能从一个基类继承实现。 但是,一个类可实现多个接口。
    public class ImpClass : BaseClass { }

    //#csg007-01
    //继承一个或多个接口
    public class ImpClass1 : SampleInterface { }

    //#csg007-01
    //继承一个类和一个接口
    public class ImpClass2 : BaseClass, SampleInterface { }

    //#csg007-01
    //继承一个类和多个接口
    public class ImpClass3 : BaseClass, SampleInterface, SampleInterface2 { }


    class A
    {
    }

    //#csg007-02
    //sealed 修饰符可以指定一个类无法被继承
    //类型B可以继承A类型,但是没有类可以继承自类型B
    sealed class B : A
    {
    }


    //#csg007-03
    //sealed还可以用来禁止虚方法被继承类override
    class X
    {
        protected virtual void F() { Console.WriteLine("X.F"); }
        protected virtual void F2() { Console.WriteLine("X.F2"); }
    }

    class Y : X
    {
        //使用seald修饰符可以组织后续的继承类override方法F
        sealed protected override void F() { Console.WriteLine("Y.F"); }
        protected override void F2() { Console.WriteLine("Y.F2"); }
    }

    class Z : Y
    {
        //尝试override F 方法会导致编译器报 CS0239 错误.
        //protected override void F() { Console.WriteLine("Z.F"); }

        //可以override 方法 F2
        protected override void F2() { Console.WriteLine("Z.F2"); }
    }


    //#csg007-04
    //结构(Struct)是隐式密封的,所以无法继承它们。




    //#csg007-05
    //泛型类的继承
    //术语:封闭式构造类型  Node<int>,类型参数指定
    //术语:开放式构造类型  Node<T>,类型参数未指定
    class BaseNode { }
    class BaseNodeGeneric<T> { }

    //泛型类型可以继承普通类型
    class NodeConcrete<T> : BaseNode { }

    //泛型类型可以继承封闭式构造类型
    class NodeClosed<T> : BaseNodeGeneric<int> { }

    //泛型类型可以继承自开放式构造类型
    class NodeOpen<T> : BaseNodeGeneric<T> { }


    //泛型类型继承自泛型类型
    //#csg007-06
    class BaseNodeMultiple<T, U> { }

    //正确方式
    class Node4<T> : BaseNodeMultiple<T, int> { }

    //正确方式
    class Node5<T, U> : BaseNodeMultiple<T, U> { }

    //未指定的泛型类型参数也必须出现在继承类的泛型类型参数中,
    //下面的代码由于U类型未在继承类中声明,所以会出错
    //class Node6<T> : BaseNodeMultiple<T, U> {}



    //#csg007-07
    //非泛型类 继承 泛型类
    //普通类型可以继承封闭式构造泛型类
    class Node1 : BaseNodeGeneric<int> { }

    //普通类型无法继承开放式构造泛型类,下面的代码会出错
    //class Node2 : BaseNodeGeneric<T> {}



    //#csg007-08
    //下表列出了可以在 C# 中创建的各种类型及其隐式继承自的类型
    //class        Object
    //struct       ValueType, Object
    //enum         Enum, ValueType, Object
    //delegate     MulticastDelegate, Delegate, Object


}