C#3
开放封闭原则(对修改封闭,对扩展开放。)
多态作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
里氏替换原则:需要一个父类类型的对象的时候,可以给一个子类类型的对象。
判断对象是否是某个类然后转换类型:if(对象 is 类){类 变量=(类)对象};或者通过as进行类型转换,如果转换失败则不报异常。只会返回null:类 变量=对象as类。【推荐使用as进行转换,这里只进行了一次类型判断。而前一种进行了两次的类型判断】。
object是没有父类的。object.BaseType返回null。
~1抽象方法不能有任何方法体(大括号内包括大括号叫方法体),不能有任何实现。~2抽象成员必须写在抽象类中。不能写在一个实例中。~3父类中的抽象成员,子类继承后必须重写(例外:除非子类也是一个 抽象类。)。~4抽象成员访问修饰符不能是private。~5抽象类中可以有实例成员。~6抽象类不能被实例化的。~7抽象类是有构造函数的,虽然不能被实例化。
即:抽象成员只能存在于抽象类中!!!继承抽象类的普通类必须实 现抽象方法!!!
重点:总结:~1抽象方法必须用abstract标记,并且抽象方法不能有任何实现,~2抽象成员必须写在抽象类中,~3抽象类不能实例化,~4子类继承抽象类后必须把父类中的所有抽象成员都重写,除非子类也是一个抽象类,则可以不重写。~5抽象成员的访问修饰符不能使private。~6抽象类中可以包含实例成员(有实例成员就有构造函数)。~7抽象类是有构造函数的,虽然不能被实例化。
关于要不要写成抽象类:如果父类要被实例化就用普通类虚方法不用抽象类!!
什么时候有静态构造函数:就3种情况:~1是个静态类就有静态构造函数~2有静态字段就有静态构造函数。~3自己写了静态构造函数。
new(*)关键字:当子类中的方法名字和父类中的方法的名字一样,在子类方法返回值类型前用new修饰则此时的子类的这个方法是个全新的方法并隐藏了从父类中继承的同名的方法。例如:多态的时候子类对象复制给父类那么表现出来的就是父类的方法了因为子类没有重写,这个new修饰的方法是个全新的方法,和父类那个同名的方法没有半毛钱关系。
如果虚方法在子类没有重写且方法名字一样如果没写override也没写new,那么默认是个new来修饰的。
重点:接口:用interface替代class来修饰那么此时是个接口而不是个类。~1接口中只能包含方法(方法、属性、索引器、事件),但是不能有字段。~2接口中也不能有任何方法实现(就像抽象方法一样,直接加一个分号)~3接口中的成员不能有任何访问修饰符(哪怕是public),默认为public。~4实现接口的类必须是实现接口的所有成员,除非它是个抽象类,才不用实现接口的成员。~5当一个类同时继承了某个类并且也实现了某个接口的时候,必须将继承的类写第一个!~接口是能多实现的~6没有继承接口且继承了实现接口的父类的子类是不能再次实现接口的,但他继承了父类实现接口的方法等成员。不同于抽象类和虚方法的重写只要是子类就可以重写(前提:没有被sealed修饰)。当然他的父类如果实现了接口的时候用virtual修饰了成为了虚方法,那么他的子类就可以重写了!!!这是个接口和虚方法一起使用的例子!!!!,这样做可以避免多次显示实现接口且实现了接口的多态~7接口成员必须不能有实现,接口不能实例化。~8类和接口的关系:类实现接口且可以多实现接口。~9接口张中的成员必须被子类中全部实现。
重点:接口的使用环境和目的:~1当多个类型,都具有某个或者多个功能时(方法),但是这几个类型又分属不同的系类(这几个类型没有共同的父类,这时候就不能用抽象类了。),所以这时,为了实现多态就可以考虑把这几个类型共有的方法提取到一个接口中,让这几个类型分别实说现接口。~2需要多继承的时候,因为继承的但根性没法实现,这时候就可以用接口代替~#接口的目的就是为了多态!!!!!!
接口之间的关系:多继承。
建议:不要在一个接口中写过多的方法,避免造成接口污染。可以编写多个接口,在每个接口中分别定义方法。
显示实现接口:当方法中已经有一个名字和实现接口的方法同名,这时候可以使用显示实现接口。要实现显示实现接口时候就用接口名.方法名代替原本实现接口的方法名,且不能有访问修饰符,他默认是私有的private。