前言
在 C# 的编程世界中,继承、多态、接口与泛型如同四位紧密协作的建筑师,共同构建着高效、灵活且可维护的软件大厦。
10.1 继承
在程序设计中实现继承,表示这个类拥有它继承的类的所有公有成员或者受保护成员。其中,被继承的类称为父类或者基类。实现继承的类称为子类或派生类。
10.1.1 使用继承
继承的基本思想是基于某个父类的拓展,产生出一个新的子类。子类可以继承父类原有的属性和方法,也可以增加原来父类所不具备的属性和方法,或者直接重写父类中的某些方法。
C#中使用 :表示两个类的继承关系。
注意:
(1)子类无法访问父类的私有成员,但是可以访问公有成员。
(2)子类无法继承父类的private成员。
(3) C#只支持类的单继承,而不支持类的多重继承,即只允许一次继承一个类,不能同时继承多个类。
(4)在实现类的继承时,子类的可访问性必须要低于或者等于父类的可访问性。
10.1.2 base 关键字
base关键字代表父类对象。
注意:
(1)如果要在子类中使用base关键字调用父类的属性或者方法,则父类的属性和方法的可访问性必须定义为public或者protected。
(2)访问父类成员只能咋构造函数,实例方法或实例属性中进行。
10.1.3 继承中的构造函数和析构函数
在进行类的继承时,子类的构造函数会隐式调用父类的午餐构造函数。
析构函数的执行顺序正好与构造函数相反。

10.2 多态
他使得子类的实例可以直接赋予父类的对象,然后直接就可以通过这个对象调用子类的方法。
10.2.1 虚方法的重写
在定义方法时,如果前面加上了关键字virtual,则该方法为虚方法。
注意:
(1)virtual不能与static,abstract,override同时使用。
(2)定义为虚方法后,可以在子类中重写虚方法。重写虚方法需要使用override关键字。
10.2.2 抽象类与抽象方法
如果一个类不与具体的事物相联系,而只是表达一种抽象的概念或行为,仅仅是作为其子类的一个父类,这样的类就可以声明为抽象类。
在C#中声明抽象类需要使用abstract关键字。
语法:
访问修饰符 abstract class 类名 [:父类或接口]
{
//类成员
}
抽象类主要用来提供多个子类可共享的父类的公共定义,与非抽象区别在于:
(1)抽象类不能实例化
(2)抽象类可以包含抽象成员,但是非抽象类不可以
抽象类中的构造函数主要有以下作用:
(1)初始化抽象类的成员
(2)被继承自他的子类使用。
在抽象类中定义的方法,如果加上abstract关键字,就是一个抽象方法。抽象方法不提供具体的实现。引入抽象方法的原因在于抽象类本身是一个抽象的概念,有的方法并不需要具体实现,而是留下让子类重写实现。
只要有一个方法被声明为抽象方法,类也必须变为抽象类。
重写抽象方法使用overrider关键字。
10.3 接口
使用接口可以实现多重继承功能。
10.3.1 接口的概念以及声明
使用接口的程序设计人员,必须严格遵守接口提出的约定。声明接口需要使用关键字interface
语法:
访问修饰符 interface 接口名称[:继承的接口列表]
{
接口内容;
}
接口特征:
(1)接口类似于抽象父类,继承接口的任何类型都必须实现接口的所有成员
(2)接口中不能包括构造函数,因此不能直接实例化
(3)接口可以包含属性 方法 索引器和事件
(4)接口只能定义成员,不能实现成员。
(5)接口中的成员默认都是公共的,不允许加访问修饰符
(6)接口中的成员不能声明为寻或者静态成员
10.3.2 接口的实现与继承
接口通过类继承来实现,一个类虽然只能继承一个父类,但可以继承任意接口。
在C#中实现接口成员时,必须添加public修饰符,不能省略或者添加其他修饰符。
10.3.3 显式接口成员实现
创建一个仅通过该接口调用并且特定于该接口的类成员。
显示接口成员不能包含访问修饰符。
10.3.4 抽象类与接口
抽象类与接口可以由子类继承实现的成员,但抽象类是对根源的抽象,而接口是对动作的抽象。
10.4 委托和匿名方法
委托是一种引用方法的类型,即委托是方法的引用。一旦为委托分配了方法,委托就与该方法具有完全相同的行为。
10.4.1 委托
委托是面向对象的,相当于函数指针,但不同于函数指针的是委托类型安全。c#支持在回调时或者事件处理时使用委托。
1.委托的声明
C#中的委托(delegate)是一种引用类型。存放的不是数据的引用,而是方法的引用。
语法:
[修饰符] delegate [返回值类型] [委托名称] ([参数列表])
注意:
(1)返回值类型 关键字delegate 委托名称是必须要的。
(2)任何自定义委托类型都继承自System MulticastDelegate类,而System Delegate类是所有委托类的父类。
一个与委托相匹配的方法必须满足以下两个条件:
(1)二者具有相同的签名。
(2)二者具有相同的返回值类型。
2.委托的实例化
将委托与特定方法绑定。使用new关键字。
3.委托的调用
Invoke();
10.4.2 匿名方法
允许一个与委托关联的代码被内联写入使用委托的位置,匿名方法是通过使用delegate关键字创建委托实例来声明的,语法如下:
delegate ([参数列表])
{
//代码块
}
10.5 泛型
泛型实质上就是使程序员定义安全的类型。
10.5.1 为什么使用泛型
经常会遇到非常相似的模块,只是处理的数据不一样。为了解决这个问题。
10.5.2 泛型类型参数
在定义泛型时,只需要指定泛型的类型参数,通常用T表示。
T命名规则如下:
(1)使用描述性名称命名泛型类型参数,除非单个字母名称完全可以让人理解。
(2)将T作为描述性类型参数名的前缀。
10.5.3 泛型方法
指在生命中包含类型参数T的方法
修饰符 void 方法名 <类型参数T>(参数列表)
{
方法代码
}
10.5.4 泛型类
修饰符 class 类名<T>
{
类代码
}
结语
掌握这些特性,意味着开发者能够以更少的代码实现更强的功能,以更优雅的设计应对需求变化。愿这些知识成为你 C# 编程工具箱中的得力工具,助你在软件开发的道路上走得更远、更稳。
105

被折叠的 条评论
为什么被折叠?



