一、c#的访问修饰符
public:公开的
private:私有的,只能在当前类的内部访问
protected:受保护的,只能在当前类的内部访问以及子类的内部访问
internal
能够修饰类的访问修饰符:public,internal,public表公开,可以在其它项目中访问,internal修饰的类只能在当前项目中访问。
二、部分类和密封类
(1)部分类
使用修饰符partial,部分类中的所有元素组成一个类,同一个类的一个部分类可以引用另一个部分类的内容。
(2)密封类(关键字sealed)
不能被其他类继承,但是可以继承其他的类
(3)
调用对象的.ToString()方法并打印结果,输出的是对象所在的命名空间。
结果为:
ToString()方法是object类的虚方法,所有类都可以调用,也可以重写。
三、1.多态的概念
多态:让一个对象能够表现出多种状态(类型)
2.实现多态的三种方法:虚方法,抽象类,接口。
(1)虚方法
首先理解作用(带来的代码的简化作用):
定义父类Person
子类Chinese
子类Japanese
子类Korea:
子类American
定义一个父类类型的数组,数组元素是子类赋的值(子类可以赋给父类):
调用函数是输出结果是父类函数的结果:
设法输出子类函数的结果需将类型转回子类:
输出结果是子类的函数。
(该例也说明as会去寻找所判定对象类型的基类或是子类,找到符合判定条件的类型即返回true)
注意:将new的子类赋给父类,类型还是属于子类
使用虚函数实现代码简化:
将父类的方法标记为虚方法,使用关键字virtual
这个方法可以被子类重新写过,使用关键字override
此时再调用则是子类的函数的结果:
(2)抽象类
当父类中的方法不知道如何实现时,可以将父类写成抽象类,将父类的函数写成抽象函数(加了关键字abstract,没有大括号和方法体)。
子类具体写父类抽象方法里的函数(加关键字override)
PS:抽象类不能创建对象,但可以创建子类的对象(引用)并赋给父类,此时调用的函数不是父类的抽象函数,而是对象(引用)实际指向数据的类型的函数。
运行结果:
小结如果父类既没有虚方法也不是抽象类,则只能调用父类的方法,只有转回子类类型才能调用子类中定义的方法。而虚方法和抽象类会考虑引用实际指向的数据的原本的类型而可以调用子类的方法。
(3)接口(使用:c#具有单根性,不支持多继承,即一个类只能继承一个父类,而可以继承多个接口,或是一个类和 多个接口且类写在接口的前面)
接口是一个规范能力。
申明接口:
接口中的方法是虚方法,接口中的成员不允许添加访问修饰符,接口中不能包含字段,一个类继承了接口必须具体写接口中的方法。
(4)接口的特点
接口也可以继承接口且只能继承接口。
四、接口与抽象类的区别
首先分清概念,抽象类是一类事物的高度聚合,接口时定义行为规范。
(1)抽象类可以包含字段,属性和方法,接口只能包含属性和方法。
(2)抽象类在定义方法时可以给出方法的实现部分,也可以不给出(给出实现部分的方法在返回值类型前加virtual或不加,未给出实现部分的方法在返回值类型前加abstract或不加);而对于接口,其中所定义的方法都不能给出实现部分,且接口的方法不能加访问修饰符。
(3)继承类对于抽象类的抽象方法可以不重写,对于接口的方法必须实现。继承类重写抽象类的方法时如果该方法在抽象类中有virtual或abstract修饰则继承类中重写加override,若没有则加new或不加。
相同点:抽象类和接口都不能创建实例。