一、基于接口编程
1、变量(参数、返回值等)的类型能用父类就不要用子类,能用接口就不要用类,返回值、属性、参数等等,类型越靠近Object越好,尽量不要用具体的类型。只要返回的类型符合签名的要求,就能够随意控制返回的对象。如果将返回值设置为NotNullArrayList,有一点不想控制非空值了,就直接返回ArrayList就可以了。
2、接口中的方法不能声明public、private等,因为没有意义,private是类内部互相调,哪儿来的类内部?接口中能声明:方法,属性,索引器,不能声明字段。接口跟类是平行的。
3、接口的多态。
4、一个接口变量可以指向实现了这个接口的类的对象,不能指向没有实现这个接口的类的对象。
5、子类继承父类,也实现了父类已经实现了的接口。
6、设计模式。世界上本没有模式,用的人多了,也就有了模式!别把设计模式当成相对论来学!弄明白了多态就明白了设计模式。
7、面试题:接口中能定义什么?接口中可以定义方法、属性、索引器。因为属性、索引器本质上也是方法。接口中不能定义字段,因为字段是实现。
8、一个类只能有一个父类,一个类可以实现多个接口。接口只能决定能干什么,怎么干由类来实现。
9、
class Program{static void Main(string[] args){//ISpeakable p1 = new Dog();//p1.Speak();ISpeakable p2 = CreateChatter(-1);//接口的优点。不管返回的是什么类型对象,只要能Speak就行p2.Speak();//调用的不是ISpeakable接口的方法,而是p2指向的对象的Speak方法Console.ReadKey();}static ISpeakable CreateChatter(int i){if (i < 0){return new Dog();}else if (i == 0){return new Cat();}else{return new Bird();}}}interface ISpeakable//接口定义的是一种能力。{void Speak();//面试题:接口中能定义什么?//接口中可以定义方法、属性、索引器。因为属性、索引器本质上也是方法。//接口中不能定义字段,因为字段是实现。}interface IFlyable{void Fly();}class Dog : ISpeakable{#region ISpeakable 成员public void Speak(){Console.WriteLine("我是狗狗!");}#endregion}class Cat : ISpeakable{#region ISpeakable 成员public void Speak(){Console.WriteLine("我是猫!");}#endregion}//一个类只能有一个父类//一个类可以实现多个接口。接口只能决定能干什么,怎么干由类来实现class Bird : ISpeakable, IFlyable{#region ISpeakable 成员public void Speak(){Console.WriteLine("我是鸟!");}#endregion#region IFlyable 成员public void Fly(){Console.WriteLine("灰呀灰!");}#endregion}}
二、基于接口编程:Max、排序
10、对List<Person>进行排序,自定义类实现IComparer<Person>接口。
11、IComparer 接口声明:int Compare(T x, T y):<0则x<y;=0则x==y;>0则x>y。
12、list.Max(new PersonComparer())
13、Max方法内部调用实现IComparer接口的对象,调用Compare进行排序,具体如何比较两个对象的大小,则是由实现类决定。
14、重用不变的(排序算法)、定制变化的(大小比较)。
15、开闭原则:对变化开放,对修改封闭。