现实点的例子 public class 食物{} public class 主食 extends 食物{} public class 面食 extends 主食{} public class 米食 extends 主食{} public class 馒头 extends 面食{} public class 包子 extends 面食{} public class 狗不理包子 extends 包子{} public class 天津产的狗不理包子 extends 狗不理包子 {} public class 面条 extends 面食 {} public class 米饭 extends 米食 {} ……如果你只吃“面”食,那么你的灵活性没有吃“主食”的强 如果你只吃“包子”,那么你的灵活性肯定比吃“面食的差 如果你只吃”天津产的狗不理包子“,你的灵活性会更差 …… 具体一点说,如果你有一个方法,需要传入一个”食物“的参数,明显你在设计你的方法时,把参数类型设置为”泛类型“比传入”精确类型“更具灵活性: // 差的灵活性 public class Person { public void f(天津的狗不理包子 food){ } }// 好的灵活性 public class Person { public void f(主食 food){ } }对第二个类,调用者可供选择的参数有很多 Person p = new Person(); ...... p.f(new 面条()); p.f(new 米饭()); f.f(new 包子()); …… 而对第一个类,调用者只能 Person p = new Person(); …… p.f(new 天津的狗不理包子());============================================== 楼主转换一个观念,继承、抽象类、接口等等多态,带来的方便并不体现在对这些类的实现上,而是体现在使用这些类的灵活性上。
using System; using System.Collections.Generic; using System.Text; namespace Example17 { class Program { //一个完整的接口声明示例 interface IExample { //属性 string P{ get; set;} //方法 string F(int Value); //事件 event EventHandler E; //索引指示器 string this[int Index]{ get; set; } } interface IA { int Count { get; set;} } interface IB { int Count(); } //IC接口从IA和IB多重继承 interface IC : IA, IB { } class C : IC { private int count = 100; //显式声明实现IA接口中的Count属性 int IA.Count { get { return 100; } set { count = value; } } //显式声明实现IB接口中的Count方法 int IB.Count() { return count * count; } } static void Main(string[] args) { C tmpObj = new C(); //调用时也要显式转换 Console.WriteLine("Count property: {0}",((IAtmpObj).Count); Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count()); Console.ReadLine(); } } }
但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。
同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率。
另外,使用接口还有使用方便,可读性强,结构清晰等优点。当然,我说的这些也可能是浅层面的,在其他方面还有很多的好处。抽象类:可以有抽象方法,也可以有方法的实现。抽象类不一定有抽象方法,而有抽象方法的类一定是抽象类。抽象类不能实例化。
接口:只有方法体的声明,没有方法实现。一个类可以实现多个接口,但只能继承一个抽象类。在项目上,我们一般的做法是:最上层为接口,中间层次为抽象类,往下就是我们的实现类。为什么我们会在中间加上抽象类呢,就是为了提高代码的可重用性,你可以在抽象类里提炼出一些公用的已经实现的方法,那么底下那些实现类只要继承它也就继承了这些方法。*****
*****
以上转载自百度.还是可以看一下的,你硬要问抽象类和接口有什么作用,真的很难泛泛的回答,具体可能还是要真正做项目的时候才好用,项目越庞大越复杂越能体会到接口的方便。楼主自己摸索吧。
在软件设计模式里,几乎所有的模式都要用到接口或者抽象类,因为这是抽象软件架构的重要方法,也是OOP所提倡的编程理念,这是从软件工程的角度谈接口和抽象类的作用
public class 食物{}
public class 主食 extends 食物{}
public class 面食 extends 主食{}
public class 米食 extends 主食{}
public class 馒头 extends 面食{}
public class 包子 extends 面食{}
public class 狗不理包子 extends 包子{}
public class 天津产的狗不理包子 extends 狗不理包子 {}
public class 面条 extends 面食 {}
public class 米饭 extends 米食 {}
……如果你只吃“面”食,那么你的灵活性没有吃“主食”的强
如果你只吃“包子”,那么你的灵活性肯定比吃“面食的差
如果你只吃”天津产的狗不理包子“,你的灵活性会更差
……
具体一点说,如果你有一个方法,需要传入一个”食物“的参数,明显你在设计你的方法时,把参数类型设置为”泛类型“比传入”精确类型“更具灵活性:
// 差的灵活性
public class Person {
public void f(天津的狗不理包子 food){
}
}// 好的灵活性
public class Person {
public void f(主食 food){
}
}对第二个类,调用者可供选择的参数有很多
Person p = new Person();
......
p.f(new 面条());
p.f(new 米饭());
f.f(new 包子());
……
而对第一个类,调用者只能
Person p = new Person();
……
p.f(new 天津的狗不理包子());==============================================
楼主转换一个观念,继承、抽象类、接口等等多态,带来的方便并不体现在对这些类的实现上,而是体现在使用这些类的灵活性上。
using System.Collections.Generic;
using System.Text;
namespace Example17
{
class Program
{
//一个完整的接口声明示例
interface IExample
{
//属性
string P{ get; set;}
//方法
string F(int Value);
//事件
event EventHandler E;
//索引指示器
string this[int Index]{ get; set; }
}
interface IA
{
int Count { get; set;}
}
interface IB
{
int Count();
}
//IC接口从IA和IB多重继承
interface IC : IA, IB
{
}
class C : IC
{
private int count = 100;
//显式声明实现IA接口中的Count属性
int IA.Count
{
get { return 100; }
set { count = value; }
}
//显式声明实现IB接口中的Count方法
int IB.Count()
{
return count * count;
}
}
static void Main(string[] args)
{
C tmpObj = new C();
//调用时也要显式转换
Console.WriteLine("Count property: {0}",((IAtmpObj).Count);
Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());
Console.ReadLine();
}
}
}
http://edu.csdn.net/main/feature/bxd_25.shtml