一.抽象类
1. 抽象方法用abstract修饰。
2. 抽象方法不能有方法体,大括弧也不能有。
3. 抽象方法必须在抽象类中。
程序示例:
1 abstract class Person 2 3 { 4 5 public abstract void SayHi(); 6 7 }
4. 抽象方法不能实例化,因为有抽象成员,而抽象成员是没有方法体的。
5. 子类必须重写父类的抽象方法。(和virtual虚方法最大的不同点)
6. 在子类中无法通过base关键字调用父类的抽象方法。
7. 抽象方法是光说不做,只是定义了具有这样的行为,但是具体的实现交给子类。
8. 抽象类中可以拥有非抽象成员,为了继承给他的子类。
9. 抽象类中可以拥有虚方法。
10. 子类必须重写父类的方法,父类没有必要实例化,就用抽象类。
11. 抽象类是被继承的,为了多态。
12.抽象方法不能是私有的,因为子类没办法访问,就没办法重写。
二.Tostring和Equals
1. object类里面equals方法是比较两个对象的引用地址,如果引用地址一样,则返回true。
2. string类型的equals方法比较的是两个字符串对象的内容,如果内容一样,则返回true。
3. 引用类型的Equals方法默认比较的是两个对象的地址,如果要改变这个规则,子类重写。
4. string值类型Equals方法比较的两个结构对象里的字段的值(这时候不存在重写,只是值类型自己新增了方法)。
二.接口
1. 使用interface来定义接口,接口表示具有某种能力。
2. 接口的本质是抽象类,是一个特殊的抽象类,所以接口不能实例化。
3. 接口内成员默认是抽象的。
4. 在接口中只能定义属性,方法,索引器,事件。
5. 抽象成员不能用访问修饰符,默认是public。
6. 实现接口的类,必须要实现接口中所有的成员。
7. 实现类在实现接口的成员的时候,不需要写override关键字。
8. 实现成员的时候,必须保证签名一致。
9. 接口就是一个纯粹的为了规范实现类的。
10. 多个具有相同的行为但是没有共同的父类就可以使用接口。
11. 一个类只能继承一个父类,但是可以实现多个接口,父类要写在第一个位置,一定程度上解决了类的单根性的问题。
12. 接口可以继承接口,并且可以继承多个接口。
13. 接口中的成员可以实现为抽象方法或者虚方法,便于实现类的子类去重写。
14. 显示实现接口是为了解决方法名冲突的问题,显示实现的接口的方法是私有的,所以不能通过对象的变量来调用。
15. 显示实现接口,这个接口的实现方法只能通过接口变量来调用。
16. 接口使用建议:
(1)接口->抽象类->父类->具体类
(2)避免定义“体积庞大的接口”,“多功能接口”,会造成“接口污染”,只把相关联的一组成员定义到一个接口中(尽量在接口中少定义成员)。(单一职责原则)
(3)定义多个职责单一的接口。
三.装箱拆箱
1. 装箱:将值类型转换成引用类型。
2. 拆箱:将引用类型转换成值类型。
程序示例:
1 int i = 12; 2 3 object obj = i; //装箱 4 5 i = (int)obj; //拆箱
3. 装箱与拆箱是比较消耗性能的,要尽量避免在我们的程序中发生这样的行为。