继承基础
1.继承的概念:从现实生活中理解继承,说我们生活中的继承主要是财产,我们程序中的继承,主要是代码(属性,方法)
2.继承的意义:通过创建一个windows窗体程序,观察两个窗体,都市继承自Form。也就是说有利于我们代码的 复用。
3.继承的要求和特点:继承具有传递性。A--->B--->C A具有B和C的相关属性和方法。也就是C会把允许继承的内容,传递给他的下一级。
要求:继承虽然可以有很多层,但是继承具有单根性!也就是说,一个类A可以继承自B,但是A不能同时继承C....C++中是允许多重继承的,但是在C#和java是不允许的。
一个类可以同时继承一个父类,同时在实现多个接口。
4.继承的基本使用方法:
【1】当我们分析某些类的时候,如果这些类之间具有先通过的属性和方法,我们可以考虑继承,但是使用继承的时候,要特别注意,我们就有继承关系的类之间,一定是“同类”。
特别注意:我们通过子类能使用的父类成员是由public类型的,但是不能直接使用private。
【2】使用:非常简单,和没有继承关系的差不多。
经验1:在实际开发中,我们自己使用继承,不要把继承关系搞得太复杂,一般不要超过3层。
经验2:如果你使用的继承过多,或继承的层数较多,万一我们如果某些代码写的有问题,改掉一个后,其他的子类全部受到影响。
5.继承与多态的实现
【1】父类的定义
Class Father
{
//公共属性
//公共方法
//私有方法(只能父类自己使用)
//受保护的属性,方法(只能子类内部使用)
//父类还有一个重要作用:就是父类可以提出一个未完成的行为(方法),然后让子类去实现!然后让子类 去实现,这个就是我们要说的抽象方法!
}
记住:抽象方法必须放到抽象类中。但是,一个抽象类,是可以不包括任何抽象方法的。
抽象方法:也就是父类规范一个行为要求,具体实现有子类完成(但是这个具有强制性)
虚方法:也就是说父类可以对这个方法有实现,但是子类也可以重新编写(重写)(不具有强制性)
【2】子类的定义
子类继承的父类如果有抽象方法,则子类必须重写抽象方法,除非子类也是抽象类。
关于虚方法的使用:
在子类中,子类可以直接完全的使用虚方法的内容,也可以完全不使用虚方法的内容。当然还可以自己实现,同时继续使用虚方法的内容。
通过调试结论:
抽象方法是不可能被调用的,只有子类重写的方法被调用。父类虚方法是否被调用,取决于子类是否被重写,和是否被调用。
【3】多态:是面向对象编程语言的程序特性,特点是,当我们调用者使用多态机制的时候,可以不关心具体的实现。我们就想象成,我们像调用一种行为,但是这种行为可能有多种表现,而具体如何表现,我们程序编写时是无法知道的。只有程序运行的时候才能确认,这个行为是虚拟机本身特有的。
多态本质:一种类型,多种行为的实现。
多态告诉我们:面向抽象编程,让你的程序扩展性大大增强。
特别注意:多态的行为,只能限于父类中的抽象方法或虚方法!
多态实现:父类定义抽象方法或虚方法,不同的子类分别重写抽象方法或虚方法即可。
6.接口与多态
多态的出现:为扩展而生!
多态的实现形式:通过继承,也可以通过接口
多态实现方法:继承--->父类类型作为方法的返回值类型(实际上返回的是一个具体的子类对象)
父类类型作为方法参数类型(实际传递的是具体的子类对象)
接口--->接口作为方法返回值类型(实际上返回是一个接口实现类对象)
接口类型作为方法参数类型(实际上传递的是一个接口实现)
接口概念
工控应用:USB接口(串口,网口。。。)
接口:就是一个标准,一个规范。USB接口:4线制(5V电源,GND,send.recive)
对于程序接口的衍生如下两个方面:
(1)当我们开发一个软件的时候,可能很多时候,我们设计完一个对象后,并不需要马上考虑,或者我们也可能不知道这个对象具体怎样去编写,我们只是知道这个对象的行为(也就是知道他干社么,但是不知道则么干)。
(2)当我们团队开发时,比如一个项目设计了10个模块,由10个小组完成。如何做到各自做个字的呢?
基于以上问题,我们可以使用接口解决
第一,我们设计对象后,可以根据行为直接设计接口(接口就是只有方法规定,没有具体实现)。
第二,我们可以把相关的模块都抽象成接口,然后接口直接相互协作,最后不同开发组实现不同的模块,这些模块开发完毕后,项目也就自动生成了。
我们始终要注意,父类一般只放共同行为,对于部分子类的行为,不能全部放到父类中,以为后面扩展的时候,这些会自动的延续给子类,所以我们可以把这部分抽象为接口。谁具有这样的行为,谁实现接口。进行统一关联。
也就是说:接口侧重于行为规范,继承侧重于代码的复用!
(1)接口规定:必须以I开头,接口的方法都是没有实现的方法,方法不需要写public。
(2)接口可以抽象方法,也可以抽象属性。关键字:interface
(3)接口的特点:接口具有强制性,也就是一个类实现一个接口,就必须把接口的所有方法都实现!并且不能改变方法的签名。
针对细节编程:就是说我们使用这个对象,是一个普通的对象,这个对象里面有什么样的属性,方法,我们就能使用什么属性和方法。
面向抽象编程:就是说我们关注的这个抽象的行为(抽象方法和行为)具体怎么实现,我们不用关心。
针对细节编程和面向抽象编程的不同:细节必须实现,如果没有实现,你根本无法提供给调用者。但是面向抽象编程则不同,抽象要求我们必须把要实现的行为为其规定好。何样的话,调用者就可以使用了。
面向抽象编程目的:第一,扩展。第二,团队开发需要。
接口和抽象类的区别
1.接口侧重的是功能的封装,抽象类侧重的是代码的复用,虽然两者都可以实现多态,但是我们在扩展中,如果没有要继承的内容,请直接使用接口。即使又要继承的内容,通常把公共内容放到父类中,然后需要多态的行为,放到接口中。
2.接口更简洁,使用更方便。在框架设计中,抽象的都会变成接口,而不是使用抽象类。
多态的基本原理依据:里氏替换原则。
系统接口的使用
接口分类:【1】自定义接口,根据我们实际的项目开发的需求,自己写接口。
【2】系统接口,也就是.NET平台已经封装好了,可以给我们直接使用的。常用的系统接口:IList<T>,ICompare<T>
3.工厂的好处
第一,对象的使用者,完全不用关心队形是如歌创建的,完全解耦。
第二,用户需求变化的时候,通过配置文件轻松实现对象的替换。
问题:如果我们需要再次扩展更多的接口实现类对象,发现工厂方法内部还得修改!这点还得需要优化。解决对象在需求变化的时候,创建问题!使用反射。
4.反射的技术应用
关于对象创建:我们可以直接通过new的方式来创建,我们通过new是因为我们明确的知道要创建的对象类型,但是我们的需求是不同的对象类型!也就是通过new方式直接不可取!
解决方法:必须通过某种方式,也要创建的对象额类型
问题继续:从哪找?怎么找?
从程序集中去找!,通过程序集给我们提供的相关类里面的方法去找。
程序集?程序集是应用程序的部署单元。
常见的程序集:控制台程序生成的exe文件就是一个程序集;winform程序生成的exe文件也是程序集;
类库生成的dll文件也是程序集!