c sharp圣经 version 5读书笔记 第6章

本文深入探讨了C#中面向对象编程的基本原理,包括继承、多态、抽象类、密封类、家族秘密、嵌套类型、方法重写、抽象方法等核心概念及其在实际开发中的应用。通过详细解析每个主题,旨在帮助开发者构建更灵活、高效且易于维护的代码结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 本章概述:三个点:第一、如何使用继承来构造相关类(什么是相关类?)在代码中定义通用功能,第二、使用虚成员和抽象成员在类层次结构中构建多态接口,第三、介绍.net基础类库总的超级父类system.object的作用。

2. 代码重用归为两类:经典继承(is-a)和包含/委托模型(has-a)。

继承保护了封装,形式 class Minvar : Car { }

只能单继承,但是一个类可以实现许多接口,而一个接口可以从多个接口派生。这样可以通过构建灵活的层次接口来建模复杂的行为。

3. sealed关键字:防止类的继承:sealed class Car{}

       View –>对象浏览器->我的解决方案-> mscorlib可以查看这里面的类和方法

4. C#中的结构是隐式密封的,见第四章,所以我们不能从结构继承结构,从类继承结构,从结构继承类,结构只能用于建模独立的,用户定义的数据类型,如果希望使用is-a关系,必须使用类。

5. base关键字的一个用法:用子类对象的构造函数去调用父类对象的构造函数,和C++的类似,只不过把类名换成了base关键字而已,连构造函数调用顺序都是一样的。先父再子。

       看起来像这样:Public Manager(string fullName,int age,int empID):base(fullName,age){ balala…;}

6. 家族的秘密:protected关键字。。。

7. 再次重申:密封类通常是工具类,用sealed标记,使用方式是包含/委托模型(has a 关系)。但是密封类也可以用于某个继承体系分支的打断。

8. 嵌套类型:我们可以直接在类或结构作用域中定义类型(枚举,类,接口,结构或委托)嵌套类型只用作外部类的辅助方法,而不是为外部世界所准备的。

       看起来像这样:

       Public class outerclass{//

              Public classpublicinnerclass{public int x;}

              Private class privateinnerclass{balala…}

}

这种形式的定义和C++中直接定义一个

Public class publicinnerclass{public int x;}

然后再以成员的方式来表示有什么不同?

9. 考虑一个问题:销售人员(类)和经理(类)的算薪方式不同:多态了吧。

10. 方法重写:多态为子类提供了一种方式,使其可以定义由其基类定义的方法。Virtual关键字用来在基类中标记可以被重写的方法,当子类需要修改该方法时,使用override关键字声明。(好麻烦,没得C++方便),当然可以用sealed来密封方法。

       派生类要调用基类的非静态方法,该怎么调用?

       Base.displaystatus();用base来调用?如果是单继承链呢,很多重,base还有效么?

11. 抽象类:很多情况下,基类的语意不是我们所关心的,例如我们更关系“你是一个什么员工(顾问)”而不是“你是一个员工”,这样我们就不能用员工类来实例化,使用abstract关键字。

       抽象方法:必须子类必须实现的方法,否则不能实例化,并且该类必须标记为abstract.

   注意:尽管不能直接创建抽象基类的实例(shape),我们完全可以使用抽象基类变量来保存指向任何子类的引用

   Shape[] myShapes = {new Hexagon(), new Circle(), new Hexagon("Mick"),

                                new Circle("Beth"), newHexagon("Linda")};

       但是只能调用基类中多态接口中的方法:

 

       foreach (Shape s inmyShapes) {s.Draw();} 

 

12.当父类没有声明为virtual的成员与派生类的成员名冲突时(这个冲突的专业术语叫阴影(shadowing)),可以的解决方案:

       a. 把派生类中的该方法声明一个override;

       b. 把继承类的该方法声明一个new;(使用第三方库时很有用)

       ThreeDCircleo = new ThreeDCircle();

      o.Draw();

      // This calls the Draw() method of the parent!

      ((Circle)o).Draw();//强制类型转换,就可以调用父类Circle的方法了。

13. 类类型的强制转换规则:系统中的最高基类是System.Object,其对象变量中保存任何类型都是合法的。

       第一条准则:如果两个通过”is-a”关系关联,在基类引用中保存派生类型总是安全的(隐式转换),它基于继承的规则。

              Object frank=new Manager(balala….);

       第二条准则:使用C#强制转换操作符进行显式的向下转换(显式转换)。

              M_rone=(Manager)frank;(运行时检测类型匹配)

当函数传进来一个基类时,我们判断它是否是派生类的类型,可以用as或者is关键字,这样就可以不用try…catch来查看类型异常了:

as关键字:在运行时快速检测某个类型是否和另一个兼容,返回null引用用法:

              Hexagon hex2=frank as Hexagon;

              If(hex2==null){balala…}

       Is关键字:检测两个项是否兼容,类型不兼容就返回false而不是null引用,用法:if(emp is Manager)…

14. 超级父类:System.Object,每一个类的最终基类:提供的方法

public override string ToString() 重载

public override bool Equals(objectobj)  这里比较的是引用类型

public override int GetHashCode(){

    return this.GetHashCode(); //当去掉.ToString()会发生无限循环的堆栈溢出异常:this.ToString()返回了string引用,再调用的string.GetHashCode()

 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值