类及泛型类的继承
继承是面向对象的编程语言的一项功能,可方便你定义提供特定功能(数据和行为)的基类,并定义继承或重写此功能的派生类。
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
}