第三天
编程原则: 能用接口, 就不用抽象类, 能用抽象类, 就不用普通类
构造函数的参数名相同,参数不同,就是构造函数的重载;
多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化
里氏替换原则
(当需要父类对象的时候,可以给一个子类类型的对象)
1.父类引用指向子类对象person p=new chinese(); (隐式类型转换)
(可以再将父类显示类型转换成子类;)chinese cn1=(chinese) p;
If(cn1 is chinese) //尽量不要使用这种判断一个对象是否属于某个类型:
当通过as进行类型转换的时候, 如果转换是被也不报异常,只会返回null
系统自动进行判断
2.父类对象不能够替换子类;
GetType是通过反射进行验证实现的,非常耗费资源, 所以尽量不要使用
寻找父类型 //object是没有父类的,所以object的父类是null;
抽象类定义的是公共的实现和能力
抽象类为子类提供所需要的成员
抽象类中的成员既可以有实现也可以无实现
抽象类必须由其子类实现它的抽象成员(除非子类也是抽象类)
一个类只能继承一个抽象类(类的单根继承性)
虚方法和抽象方法的区别
虚方法必须有实现,抽象方法必须没有实现
抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中
抽象方法必须在子类中重写,虚方法可以被重写
实现多态的主要手段:
1.虚方法virtual
2.抽象方法abstract
3.接口
普通类中,可以有抽象方法,那么这个类就成了抽象的了;
抽象:
1.抽象成员必须标记为abstract,并且不能有任何实现;2.抽象方法不能有任何方法体.(不能有任何实现)
3.抽象成员必须在抽象类中,不能再普通类中, 即实例中
4.虚拟成员和抽象成员不能是private 私有的
5.抽象类不能被实例化 //抽象类就是被继承的;
6.实例化的时候必须有构造函数, 抽象类中可以有构造函数,但不能被实例化
7.抽象类中可以有实例成员也可以有抽象成员;
当父类中的方法没有默认实现, 父类也不需要实例化时, 就可以把父类写成抽象类; 就像动物的叫声一样,不需要知道默认的实现;
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个虚方法来实现多态;
类中的成员不写访问修饰符,默认是私有的 private
接口:
接口就是一种规范, 协议 ,约定好遵守某种规范就可以写通用的代码
定义了一组具有各种功能的方法 (只是一种能力,没有具体实现,想抽象方法一样,”光说
不做”)
接口存在的意义:多态, 多态的意义: 程序可扩展性, 最终 --节省成本,提高效率.
接口解决了类的多继承的问题;
接口解决了类继承以后体积庞大的问题;
接口之间可以实现多继承;
1.接口中只能包含方法 (方法. 属性. 索引器. 事件)
2.接口中的方法也不能有任何实现 (就像抽象方法一样,直接加一个分号)
3.接口中的成员不能有任何访问修饰符(哪怕是public) 默认为public
4.接口不能实例化
5.实现接口的类, 必须实现接口中所有的成员;
6.类不能多继承, 所以在某些情况下,只能用接口来代替,因为 接口可以多实现
7.接口的主要目的: 就是为了实现多态;
8.当一个类同时继承了某个类,并且也是实现了某些接口的时候,必须要将继承的类写在第一个, 就是最前面;
9.当多个类型,都具有某个或某几个功能时(方法), 但是这几个类型又分属于不同的系别,(这几个类型没有共同的父类,这时就不能用抽象类了.), 所以这时,为了实现多态就可以考虑吧这几个类型共有的方法提取到一个接口中, 让这几个类型分别实现这几个接口;
10.接口与接口之间的继承, 类与接口之间叫实现,
接口尽量简单,不要有太多的方法, 可以编写多个接口,在每个接口中,分别定义方法; 具体根据实际做;
11.实现接口的时候直接写方法就行,不要写override;