c 子类对象 访问父类对象受保护成员_第十一章 面向对象

b2e50526cd721b7f6f7f60d59747abee.png

11.1 概述

C#是面向对象的语言,所有面向对象的语言都具有三个基本的特征,它们是:

封装:把客观事物封装成类,并将类内部实现隐藏,以保证数据的完整性。

继承:在已有类基础上派生出新的类,已有类被称为父类基类,新类被称为子类派生类,子类拥有父类除构造函数、析构函数、赋值运算符重载及静态成员之外的所有成员。通过继承可以复用父类的代码。

多态:允许将子对象赋值给父对象的一种能力。

C#中的面向对象编程指的是运用这三个基本的特征来编写程序。

11.2 封装

封装指的是把类的内部实现隐藏起来,不让对象直接对其进行操作。C#提供了属性机制对内部的状态进行操作。在C#中,封装可以通过权限访问修饰符public,protected,private,internal来体现。

F&A为什么使用封装?

为防止外界直接访问类内成员而破坏类的完整性。

面向对象的封装特性,是一种保护状态数据完整性的方法,在面向对象编程中,应更多的定义私有字段,并且使用属性机制来对私有字段进行访问。下面代码演示了封装的具体操作:

// #region << 版 本 注 释 >>

11.3 继承

11.3.1 继承定义

继承:在已有类基础上派生出新的类,已有类被称为父类基类,新类被称为子类派生类,子类拥有父类除构造函数、析构函数、赋值运算符重载、私有成员及静态成员之外的所有成员。通过继承可以复用父类的代码。需要注意的是,私有成员也会被子类继承,但是子类不能直接访问私有成员。子类可以通过调用公有或者保护方法间接的对私有成员进行访问。

eg:

// #region << 版 本 注 释 >>

11.3.2 抽象类

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。在C#中使用关键字 abstract 来定义抽象类和抽象方法。

【抽象类特性】

  • 抽象类使用abstract关键字修饰, 不能被实例化,可以被继承。
  • 抽象类成员包括:抽象属性、抽象方法、虚方法、非抽象属性、非抽象方法、非静态成员以及静态成员等,简言之,抽象类能够被用于类,方法,属性,索引器和事件。
  • 抽象类成员一般使用public修饰符。
  • 抽象类中的所有抽象属性和方法都必须在子类中重新实现。

【抽象方法特性】

  • 抽象方法只有方法声明,没有方法体,不需要实现。
  • 抽象方法只能在抽象类中声明。

eg:

public 

综合案例:

// #region << 版 本 注 释 >>

11.3.3 密封类

密封类是指不能被继承的类,强行继承会产生编译错误。C#中使用sealed关键字来定义密封类,如下代码所示:

//定义密封类

11.3.4 子类初始化顺序

使用了继承之后,当我们初始化一个子类时,除了会调用子类的构造函数之外,同时也会调用基类的构造函数,子类的初始化顺序如下:

1:初始化类的实例字段

2:调用基类的构造函数,若没有基类,调用System.Object的构造函数。

3:调用子类的构造函数。

下面通过一个例子演示调用顺序:

// #region << 版 本 注 释 >>

11.4 多态

11.4.1 多态定义

由于可以继承基类的成员,子类就有了相同的行为,但是有时子类的某些行为需要相互区别。子类需要覆盖父类中的方法来实现子类特有的行为,这就是多态。多态即相同类型的对象调用相同的方法却表现出不同行为的现象。

11.4.2 virtul和override关键字

只有基类成员声明为virtual或者abstract时,才能被派生类重写;而子类想改变虚方法的实现行为,则必须使用override关键字。

下面的代码演示了C#对多态的支持:

// #region << 版 本 注 释 >>

上述代码相同类型的对象调用相同的方法确实表现出了不同的行为,这就是多态的精髓。

11.4.3 sealed关键字

11.3.3小节中,用sealed关键字可以防止一个类被其它类继承。同样也可以使用sealed关键字来阻止派生类重写虚成员。例如,我们希望Horse的继承类不再扩展Voice方法,则可以使用sealed关键字来停止虚拟继承,如下代码所示:

public 

11.4.4 new关键字

在实际开发中,若确是需要添加某个方法,但是该方法又于基类的方法同名,那么可以使用new关键字把基类成员隐藏。如果不使用new关键字,在派生类中定义一个与基类成员同名的成员,编译器将产生警告。

// #region << 版 本 注 释 >>

11.5 类解析

在C#中,所有的类都派生自System.Object,如果定义的类没有指定任何基类,编译器就会自动把Object当作基类。

public 

具体的方法就不再详细叙述,大家可以参考MSDN的相关介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值