多态(让一个对象能够表现出多种的状态,即类型)
三种方法:
a.提供的类中能够抽象出一个父类,且父类中必须写几个类共有的一个方法,在不知道怎么写这个方法的情况下用抽象类;
b.若抽象出来的父类中的方法可以写,并需要创建父类的对象,用虚方法;
c.给出的类中根本找不出父类,但都有一个共同的能力,用接口(多继承情况)。
1.虚方法
将父类的方法标记为虚方法,使用关键字Virtual,这个函数可以被子类重新写一遍,子类需要加关键字Override;
**调用的仍然是父函数,只是在子类中重新写了一遍,调的是被子类重写的方法。
2.抽象类
当父类中的方法不知道如何实现时,可以考虑将父类写为抽象类,将方法写成抽象方法;抽象方法没有方法体。
方法写成抽象方法要点:
a.抽象成员必须标记为abstract,并且不能有任何实现;
b.抽象成语必须在抽象类中;
c.抽象类不能被实例化;(即不能创建对象,因此只能创子类对象)//Animal a=new Dog();
d.子类继承抽象类后必须把父类中的所有抽象成员都重写;(除非子类也是一个抽象类,则可以不重写)
e.抽象成员的访问;
f.抽象类中可以包含实例成员,且可以不被子类实现;
g.抽象类是有构造函数的,虽然不能被实例化;
h.如果父类中的抽象方法有参数,那么继承此父类的子类在重写父类的方法时,也必须传入对应参数;若父类的抽象方法中有返回值,那么子类重写时也要传入对应返回值。
**如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态;如果弗雷中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
3.接口
访问修饰符
Public,Private,Protected
Internal:只能在当前项目中访问,在同一项目中,internal与Public权限一样;
能修饰类的只有Public,Internal;
*子类的访问权限不能高于父类,否则会暴露父类成员。
值传递&引用传递
值类型在复制的时候传递的是这个值本身;
引用类型在复制时传递的是对这个对象的引用;(例如地址)
p1,p2地址相同,改变其中一个都会变。
**特殊情况
string s1="男";
string s2=s1;
s2="李四";
//结果s1为男,s2为李四;**因为字符串的不可变性。
序列化&反序列化
序列化:将对象装换为二进制
反序列化:二进制转换为对象
作用:传输数据
[Serializable]将序列标记为可以被序列化
//
BinaryFormatter bf=new =BinaryFormatter();
bf.Serializable();
bf.Deserializable();
部分类:partial;
密封类:sealed,不能被其他类继承,但可以继承其他类。