面向对象 方便以后的扩展和维护
封装 黑匣子 隐藏具体实现
继承
使代码可以重用
子类继承父类的属性和方法 :
单根继承性 继承具有传递性
所有的类都直接或间接的继承自Object
this 代表当前类的实例,base 代表父类的实例
protected
子类构造函数必须指明调用父类哪个构造函数
访问级别约束
子类的访问级别要比父类的低
方法、属性等暴露的返回值、参数的数据类型不能比方法、属性或者所在类的可访问级别低
多态 不同对象执行同一行为(方法)有不同的表现
里氏替换原则
让父类引用指向子类对象
Person per = new Student();
per是父类的引用,它不知道有哪些子类
不能使用父类的引用,调用子类的成员
is if (shapes[i] is Circle) 判断对象是不是后面的类型
as Circle cir = shapes[i] as Circle; 如果转换失败返回null
熟练计算形状的案例
抽象类和抽象方法 abstract
抽象类
不能被实例化的类 不能去new
!!抽象类用来实现继承 和 多态
抽象类定义的是公共的实现和能力(抽象方法,没有实现)
抽象类中可以包含抽象成员,也可以不包含
抽象类不能被密封
抽象方法
抽象方法不能有实现
抽象方法必须出现在抽象类中
抽象方法必须被子类重写(override),除非子类也是抽象类
多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
虚方法 virtual,虚方法给父类提供了一种默认的实现,
子类可以使用override重写虚方法
虚方法不能出现在密封类(sealed)中
虚方法和抽象方法的区别
虚方法必须有实现,抽象方法不能有实现
抽象方法只能出现在抽象类中
抽象方法必须被子类重写(),虚方法可以被重写也可以不重写
(*)密封类 sealed 不能被继承的类,调用密封类成员更高效(调用sealed类的方法的时候
不用 看该方法是否被override了)
接口
接口是定义类的一组标准和规范
接口的出现是为了解决类的单根继承性
接口不能被实例化
可以同时实现多个接口,如果同时继承类和实现接口,类必须在最前
接口可以继承接口
接口中的成员不可以加访问修饰符,隐式为public
接口中的成员不能有实现
接口中的所有成员必须在子类中去直接实现
接口中可以包含属性、方法,但不能包含字段,构造函数
接口提供能力
一个接口只做一件事情
//接口污染
interface IFlyable
{
void Fly();
void Speak();
}
接口和抽象类
抽象类中可以有实现而接口中不能有实现
抽象类和接口都不能被实例化
接口的成员在子类中直接实现,抽象类中的抽象成员要重写override
什么时候使用抽象类,什么时候使用接口
抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
飞机会飞,鸟会飞,他们都实现了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。