抽象思维之共性_抽象类的作用_接口的作用_抽象类和接口的区别(三)
四、用库中的接口实现
在上面的冒泡排序中,我们自己定义了接口,其实在库中,已经有定义好的比较大小接口,我们直接继承过来用即可。下面是使用库中的接口予以实现,冒泡排序,
用库中的接口实现和用自定义的接口实现,大同小异,下面我们仅给出这种方式的代码:
person类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace InterfaceBubleSort
{
public class Person:IComparable
{
private int age;
public int Age
{
get
{
if (0<age&&age<100)
{
return age;
}
else
{
Console.WriteLine("年龄输入错误!");
return 0;
}
}
set
{
if (0<value&&value<100)
{
age = value;
}
else
{
Console.WriteLine("年龄输入错误!");
}
}
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Person(string name,int age)
{
this.age = age;
this.name = name;
}
#region IComparable 成员
public int CompareTo(object obj)
{
return this.Age - ((Person)obj).Age;
}
#endregion
}
}
冒泡排序类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace InterfaceBubleSort
{
public class BubleSort
{
public void BubleSortMethord(IComparable[] array)
{
for (int i = 0; i < array.Length; i++)
{
for (int j = 0; j < array.Length-i-1; j++)
{
if (array[i].CompareTo(array[i + 1]) > 0)
{
IComparable temp = array[i];
array[i]=array[i+1];
array[i+1]=temp;
}
}
}
}
}
}
主函数类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace InterfaceBubleSort
{
class MainEntry
{
static void Main(string[] args)
{
BubleSort bublesort = new BubleSort();
Person a = new Person("白连启", 23);
Person b = new Person("侯勇蛟",24);
Person c = new Person("李娜",23);
Person d = new Person("李国璋",24);
Person[] persongs = { a,b,c,d};
Console.WriteLine("未排序时:\n");
foreach (var item in persongs)
{
Console.WriteLine(item.Name);
}
bublesort.BubleSortMethord(persongs);
Console.WriteLine("\n排序后:\n");
foreach (var item in persongs)
{
Console.WriteLine(item.Name);
}
}
}
}
总结:1、类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类。而接口只是一个行为规范或规定。抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中。2、接口基本上不具备继承的任何具体特点,它仅继承了能够调用的方法。3、一个类一次可以实现若干个接口,但是只能扩展一个父类。4、接口可以用于支持回调,而继承并不具备这个特点。5、抽象类不能被密封。6、抽象类中的方法默认为虚的,但是实现接口的类中的接口方法却默认是非虚的,当然也可以声明为虚的。7、抽象类实现了面向对象的一个原则,把可变的和不可变的分离。抽象类和接口就是定义不可变的,而把可变的让子类去实现。8、好的接口应该是专一功能的,而不是多功能的,否则造成接口污染。9、如果抽象类实现接口,则可以把接口中的方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中的方法。
关于接口和抽象类的形象比喻:
1、飞机会飞,鸟会飞,他们都继承了同一个接口”飞“,但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2、铁门和木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或者木门(多态),而且只能是门,你不能说它是窗(单继承),一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也发出声音吧(接口污染))。