一、基于接口编程
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、开闭原则:对变化开放,对修改封闭。