2015-10-28 C#4
五.继承
5.1 父类又称(基类,超类)是被继承的类,子类又称派生类。
5.2 A:B,A就叫子类,B叫父类,B里面所有的成员(字段,方法)都会被A继承。 B里面的私有成员,A也是继承下来了的,只是没有访问权限。
5.3 A:B B:C ===》A:C
5.4 任何类型的基类是Object类
5.5 使用sealed关键字,其他类无法继承此类,代表密封类 :sealed class Person{}
5.6 A:B B里面有SayHi方法,用A的对象调用SayHi的时候,首先调用的是B里面的构造方法,然后是A的构造方法,最后才是SayHi,如果B上面还有继承的类,则先调用该类的构造方法
5.7 A:B,A和B里面都有一个方法SayHi,默认情况下,运用A的对象调用SayHi的时候,调用的是子类的SayHi,父类的被隐藏了。
注:new:1.实例化对象2.隐藏一个类的方法
5.8 重写/覆写
A:B,A和B都有一个方法SayHi,当B里面的SayHi方法是一个虚方法(virtual)的时候,A里面的SayHi才能被覆写/重写,通过关键字override重写
ru: public virtual/override void SayHi(){}
构造函数不能被复写
5.9里氏替换原则:子类对象可以赋值给父类变量,反之不成立
Person p=new Chinese();√
A:B,A和B里面都有一个方法SayHi,当 B b=new A(), b.SayHi()默认情况下(没有被覆写)的时候,就近原则调用的是父类。
如果sayhi被覆写,调用的是子类。
六.多态
6.1 多态分为重载(overload)和覆写(override)
重载:方法名相同,方法里面的参数个数或者类型不同。
6.2 只有父类的虚方法(virtual)才能被子类覆写,子类实现覆写用关键字override,如果不加override就隐藏了父类的方法(需要加上关键字new,eg: public new static void aa())
6.3 静态方法不能被覆写,但可以被隐藏
6.4 静态类里面只能有静态成员
6.5 静态的成员不能带override ,virtual ,abstract
七.接口,抽象类,泛型
7.1 抽象类、抽象方法
1. abstract +类名,abstract+方法名
2. 抽象类不能被实例化
3. 抽象方法的作用是为子类提供一个统一的接口,抽象方面里面只有声明,没有实现
4. 一个类一旦继承了一个抽象类,就必须实现对该抽象类里面所有的抽象方法的实现
5. 一个抽象类里面可以有非抽象方法,但是一旦一个类里面有抽象方法,该类就为抽象类了
6. 抽象方法在声明后用一个;结束,不需要用{}
7.抽象方法在覆写的时候不需要声明为虚方法
public abstract class Program { public abstract void A(); public abstract void B(); } public class C : Program { public override void A() { Console.WriteLine("China"); } public override void B() { Console.WriteLine("nihao"); } public static void Main() { C me = new C(); me.A(); } }
7.2接口
1. Interface +类名
2. 接口用来实现多继承,一个类只能有一个父类,但可以继承于多个接口class A :B,C //类是单继承,接口是多继承
3. 接口是一种特殊的抽象类,它里面规定得更严格,里面的方法只能为抽象方法
4. 定义一个接口的时候,一般为缺省,即interface +类名,前面自动加上了public abstract,定义接口中的方法时,也只需要写返回类型 +方法名即可,因为也默认为 public abstract
5. 接口里面的所有成员都是公共的,抽象类里面的成员可以是私有的,公共的,受保护的
6. 一个类继承与一个接口,就必须完成该接口中所有方法的实现
interface Interface1 ///新建接口 { void A(); void B(); } class Class3:Interface1 { public void A() { } public void B(){ } }