二、抽象类 1、虚方法与抽象方法
抽象方法用abstract 修饰,虚拟方法用virtual 修饰;
抽象方法不能有方法体,抽象方法必须在抽象类中,抽象方法不能实例化;
子类中无法通过 base 关键字 调用父类的抽象方法;抽象方法光说不做,只是定义具有这样的行为, 但是具体实现交给子类,而虚方法有实现;
2、抽象类
抽象类中可以存在非抽象成员,抽象类的目的是更好的继承,从而实现多态;
子类必须重写父类,父类没有必要实例化,就用抽象类;
抽象类是有构造函数的,如果没有显式定义,编译器自动生成一个无参构造函数,虽然不能被实例化 ,但是要被子类对象调用,并初始化抽象类成员;
抽象类成员不能是私有的,私有的子类访问不到,无法重写;
抽象类中可以有虚方法;
三、接口
命名规范:I**able,例如IFlyable ,IComparable ;使用 interface 关键字定义接口。
接口表示具有某种能力,是一个特殊的抽象类:
1、所有成员默认都是抽象的;
2、不能有访问修饰符,默认是 public,不能被实例化;
3、实现类在实现接口成员时,不写 override (抽象方法和虚方法重写的时候都要写 override );
接口中可以定义的成员有属性、方法、索引器、事件。实现接口的类必须实现接口中的所有成员,可以用 快捷键Alt+Shift+F10 ,接口名字处快速实现所有成员;
实现成员时必须保证签名一致;接口就是纯粹为了规范实现类;自动属性不是自动属性(prop + 两次 Tab),只是普通属性,get、set 方法不实现;
接口很好的解决了类的单根性,一个类只能有一个父类,写在第一位,但是却可以实现多个接口。
接口可以继承接口,支持多继承。
抽象类与接口的区别:
1、可以找到父类并且希望通过父类继承给子类一些成员时,用抽象类
2、多个类具有相同的方法,但却找不到共同的父类,就可以将某个类特有的方法定义在接口中。比如,鸵 鸟与麻雀,同样是鸟类,但是鸵鸟不会飞,麻雀会飞,这时可以定义一个 IFlyable 接口,接口里面有一个 Fly() 方法,让麻雀来实现该接口。
|