C#系统学习第十章——面向对象编程进阶

前言

        在 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# 编程工具箱中的得力工具,助你在软件开发的道路上走得更远、更稳。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值