第5章 继承

第5章 继承

继承是面向对象编程语言的一个重要特性。

public class Form1:System.Windows.Forms.Form

这表明我们创建的窗体是Form类的一个子类,而不是它的实例。

5.1 构造函数

所有的类都有专门的构造函数,在创建类实例时调用它.
构造函数的名字总是与类名相同,这一点适用于Form类,也适用于非可视化类.

在创建自己的类时,应当创建构造函数去做初始化工作,可以把参数传到类中,将类中的数据初始化为指定值.
如果编写的类型里没有构造函数,系统会自动一个不带参数的构造函数.

InitializeComponent方法也是由IDE生成的,它包含了创建和安置窗口中所有可视化控件的代码.


5.2 C#中的绘图和Graphics对象

C#中的控件由Windows系统重新绘制,paint(绘制)事件发生时,可以将它连到paint事件处理程序上来完成自己的绘制工作。
当窗口改变大小,重新可见或刷新时,发生paint事件.

5.4 名字空间

vs.net为每个项目创建一个和项目名相同的名字空间.
可以在属性页修改该名字空间,也可以把它变为空白,这样该项目就不在名字空间里。
仍然可以创建属于自己的名字空间.


5.4.1 由Rectangle类创建Square类
无须正方形只不过是矩形的特例,

5.5 公有是,私有的和保护的

在C#中,可以将变量和类方法声明为公有的(public),私有的(private)或保护的(protected).
公有方法可以被其他的类访问。
私有方法只能在类内部访问。
通常将所有的类变量声明为私有的,并编写getXxx和setXxx访问函数来设置或获取数据.
让类中的变量能在类外直接访问,通常是一个很差的注意,因为它违反了封装原理。
换句话说,类应该是唯一知道实际数据表示的地方,你应该能修改类内部的算法,但类外面的任何人都不能这样做。

C#使用protected关键字,变量和方法都可以是受保护的,受保护的变量能在该类及其派生类里访问。
同样地,受保护的方法也只能由该类和它的派生类访问。
类外部不能访问受保护的变量和方法。

如果没有声明任何访问级别,默认为私有访问.


5.6 重载

C#也允许有若干名字相同的方法,只要这些方法有不同的调用参数。
通过把构造函数声明为不同数目的参数,就可以重载构造函数。
当然C#也允许重载任何方法,只要提供的参数能让编译器区分被重载的(或多态)方法。


5.7 virtual和override关键字

如果基类中有一个方法,而想在派生类中覆盖它,应该把基类中的方法声明为virtual
其含义是:让派生类里具有同样名字和参数标识的方法被调用,而不是调用基类中的方法。

然后,在派生类中必须用override关键字声明该方法.如果在派生类里使用了override关键字,但没有把基类中的方法声明为virtual,编译器会将其标记为错误.

如果在派生类里创建一个方法并且没有把它声明为override,也没有把基类中的方法声明为virtual,程序编译时会发出警告,但能正常工作,正如读者预期的那样,调用的是派生类中的方法.

5.9 使用new替换方法

当不能把基类方法声明为virtual时,另一种取代基类中方法的方式是在派生类中声明方法时使用new关键字.这样做能有效地隐藏基类中同一名字(与参数无关)的方法.
这种情况下,不能在派生类调用基类中的同名方法,而且必须把所有的代码都放在替换方法中。

5.11 接口

接口是一个声明,它规定了一个类要包含的带有指定参数的一系列专门方法。
如果一个类含有这样一些方法,就说它实现了接口.
接口本质上是一个规约,即一个类应该包含接口所描述的所有方法。
接口声明公有方法的签名,但不包含方法主体.

若一个类实现了Xyz接口,则可以假定它就是Xyz类型来引用这个类。
接口是让一个类有两个或两个以上基类的唯一方式.

当在具体类里实现接口的方法时,应该声明这个类使用了该接口,还要提供接口中每个方法的实现过程。


5.12 抽象类

抽象类声明了一个或多个没有实现的方法。
如果把一个方法声明为抽象的,也要把类声明为抽象的。

不能创建抽象类的实例,只能创建实现了抽象方法的派生类的实例。


5.13 接口和抽象类的比较

创建一个接口就是创建了一个或多个方法的定义.
在每个实现该接口的类中必须实现这些方法.系统不会生成任何默认的方法代码,必须自己完成实现过程.
接口的优点是它提供了一种让一个类成为两个类的子类的方式:一个是继承,一个来自子接口,如果实现该接口的类漏掉了一个接口方法,编译器会产生错误.

创建一个抽象类就是创建了这样一个基类。
它可能有一个或多个完整的,可以工作的方法,但至少有一个方法有一个方法来实现并声明为抽象的.
不能实例化一个抽象类,而必须从它派生出类,这些类包含了抽象方法的实现过程。
如果一个抽象类的所有方法在基类中都未实现,它在本质上就等同于一个接口,但限制条件是,一个类不能从它继承,也不能继承其他类层次结构,而使用接口则可以这样做。
抽象类的作用是对派生类如何工作提供了一个基类定义,允许程序员在不同的派生类中填充这些实现过程.

另一种相关方式是创建带空方法的基类,这些空方法可以保证所有的派生类都能够编译.


5.14 小结

学习了C#大部分重要特性。继承,构造函数以及重载方法的功能,甚至能创建Windows控件的派生版本。

 

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值