我在项目中大量使用接口,如果是多人合作项目更是不可少,举个例子:我要写一个打印程序,但是面临的问题是必须使用不同的打印机,有HP的,IBM的、Epsom的等等。但是针对每一个打印机的程序只有2个必须要用到的函数,Print(),PrintPreview(),这两个函数不同的打印机里面的具体实现代码是不一样的,但是从主程序的角度来看是无所谓的,因为主程序只是要调用一下Print和PrintPreview函数以便达到效果而以好了,现在设计这样一个打印接口 IPrint public interface IPrint { void Print(); void PrintPreview(); }那么现在我来写一下主程序,就是调用这个接口的程序static voic Main() { Console.WriteLine("Plesas select printer:"); string printerName = Console.Readline(); IPrint printer = null; if(printerName == "HP") { printer = new HPPrinter(); } else if(printerName == "IBM") { printer = new IBMPrinter(); } else if(printerName == "Epsom") { printer = new EpsomPrinter(); } printer.PrintPreview(); printer.Print(); } 好了,这就是主程序,你首先要选择你要用那种打印机,比如你输入"IBM",那么程序就会实例化一个IBM的打印机程序 new IBMPrinter();然后,程序执行PrintPreview()和Print()函数OK,现在,主程序有了,那么我为了最快地完成任务,只要找到3个熟悉HP,IBM,EPSOM打印机的专业人才,分别写3个类,每个类继承IPrint接口,那么所有的任务完成了,多么优美,多么简洁漂亮。这三个类如下:public class HPPrint : IPrint { public void PrintPreview() { Console.WriteLine("this is HP Printer"); }
public void Print() { Console.WriteLine("this is HP Printer"); } }public class IBMPrint : IPrint { public void PrintPreview() { Console.WriteLine("this is IBM Printer"); }
public void Print() { Console.WriteLine("this is IBM Printer"); } }public class EpsomPrint : IPrint { public void PrintPreview() { Console.WriteLine("this is Epsom Printer"); }
public void Print() { Console.WriteLine("this is Epsom Printer"); } }这就是接口的作用,如果你的悟性达到一个程度,看完我的介绍,应该马上会领悟到接口的优美和其重要性
以便在 SA / OOD / 系统开发、事后维护、功能扩充 上更有弹性。WCF 中也是建议先用 interface 做 memeber、method 的定义,再由自定义类去实践。
亦可参考 SA / Design Patterns 的文件和书籍。
例如返乡的火车订票系统,我们(或SA,SD) 可以先定义一个叫做「订票需求」的 interface,里面只要有一个空的「是否能订票」的函数即可。
而可能有一或多个自定义 class,分别叫做「特定班次」、「特定座位」、「特定ooxx」、… 的class,
都是「实作(implement)」这个「订票需求」interface,因此也都已有了这个「是否能订票」的函数,而程序员,就去把这几个实现的 class 的「是否能订票」的函数去写出来,
因此在 SA 阶段,程序语言不是重点。日后这个火车,若是订位方式改变、或座位改变、或是要加入或改变其它订票的功能和需求,
就不用再去动到「订票需求」的 interface,
只要更动实现它的 class 即可,
程序员改好某个 class 的「是否能订票」的函数之后,再 Plug-in 到系统里即可。
不会去动到 SA 和整个系统架构,这在中大型项目中尤其重要,不论是 .NET / J2EE 皆然。
亦可参考 SA 系统分析、OOD、UML 的书籍。
然后调用时,并不要知道实现类是怎么实现的具体操作,调用接口的方法就可以了
例子么:IDisposable接口
public interface ISave
{
void SaveData(string data);//data当然可以是更复杂的数据
}public class DataManager
{
public ISave Saver{get;set;}
public string Data{get;set;}//当然可以是更复杂的数据
}public class TextSaver:ISave
{
public void SaveData(string data){}//保存到文本文件
}public class DataBaseSaver:ISave
{
public void SaveData(string data){}//保存到数据库
}
....
public static main(..)
{
DataManager dm=new DataManager();
dm.data="adfqwei";
dm.Saver=new TextSaver();
dm.SaveData();//保存到文本文件(可以只更改TextSaver()类或实现多个达到保存为.txt,.doc,.xml等文件
dm.Saver=new DataBaseSaver();
dm.SaveData();//保存到数据库(可以只更改DataBaseSaver()类或实现多个更达到保存到多种数据库(access,sql等);
}
而c#中的接口我觉得在设计角度解释比较好一些,接口是对行为的一种的抽象,可以对不同类的行为进行
抽象,例如:飞()这个行为,应该不属于人类,而超人类可以继承人类,但这个超人类必须实现飞这个方法
怎么办呢?鸟类能实现飞();飞机物亦能,而超人类,鸟类,飞机物类如何抽象上层类呢?很明显很难抽象了,
除非object,但这样不行,这时接口可以解决问题,我们构造一个IEnableFly{void fly();},这样这三个
类都能实现fly这个方法了.
OOP 繼承,封裝,多態。如果 你写一个 程序 person 和 student 类
用person 派生出student子类 子类可以重写父类的 方法 但如果有一个和父类不相关的 方法 那你会怎么去写???一个子类只等去继承一个父类 但一个类可以去多次继承接口 OK!!! 就是这样 本人才疏学浅 希望对你有所帮助
public interface IPrint
{
void Print();
void PrintPreview();
}那么现在我来写一下主程序,就是调用这个接口的程序static voic Main()
{
Console.WriteLine("Plesas select printer:");
string printerName = Console.Readline();
IPrint printer = null; if(printerName == "HP")
{
printer = new HPPrinter();
}
else if(printerName == "IBM")
{
printer = new IBMPrinter();
}
else if(printerName == "Epsom")
{
printer = new EpsomPrinter();
} printer.PrintPreview();
printer.Print();
}
好了,这就是主程序,你首先要选择你要用那种打印机,比如你输入"IBM",那么程序就会实例化一个IBM的打印机程序 new IBMPrinter();然后,程序执行PrintPreview()和Print()函数OK,现在,主程序有了,那么我为了最快地完成任务,只要找到3个熟悉HP,IBM,EPSOM打印机的专业人才,分别写3个类,每个类继承IPrint接口,那么所有的任务完成了,多么优美,多么简洁漂亮。这三个类如下:public class HPPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is HP Printer");
}
public void Print()
{
Console.WriteLine("this is HP Printer");
}
}public class IBMPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is IBM Printer");
}
public void Print()
{
Console.WriteLine("this is IBM Printer");
}
}public class EpsomPrint : IPrint
{
public void PrintPreview()
{
Console.WriteLine("this is Epsom Printer");
}
public void Print()
{
Console.WriteLine("this is Epsom Printer");
}
}这就是接口的作用,如果你的悟性达到一个程度,看完我的介绍,应该马上会领悟到接口的优美和其重要性
例子挺通俗易懂的,但不是很好吧,用继承的话有很大区别么?
小团队在实际开发中这么做除了多写点代码,告诉别人说我这是用了接口编成外还有什么优势么?
现在玩感念的人太多,接口也不是那么好玩的,不好意思不是针对你
WCF好,小网站用得着么
这个鸭子的例子,可以看出接口与继承的区别
如果你这么说,如果要给HP打印机和IBM打印机增加一个新功能如Scan(),如果用基类虚函数就得重新修改基类,基类修改会影响到所有继承他的类,系统成型后修改基类是非常危险的,而用接口只需让HP的,IBM的打印类再继承一个IScan接口就行了,不会影响到其他类,这就是接口优越于虚函数的地方。
比如我们开发一个学生管理系统
有三类学生:小学生,中学生,高中生.
用三个模块来实现各自的功能,每个模块分一个组员a,b,c开发,.
程序中要对三类学生的家庭信息进行处理,这是另外一个模块
这个模块需要使用三个类型的管理方法
由D来完成,请问是不是要等a,b,c都完成后D才开始工作呢?
显然不行.
那我们定义接口包含未实现的管理方法,实现在三个类中各自实现.
这样,D就可以基于接口编程,而不需要等到其他模块实现完成.
一点点小的说明,呵呵
很多的教程,实例以各种各样打印机作为例子,说打印机有各自的打印方法,此时需要接口,毕竟这样的例子也许会有,但是大多数人不一定会碰到,所以说例子不能太理想化,对于接口的发明者来说,他要考虑到人世间的种种情况,可以理想化.大家最喜欢的直觉,就是对于自己现在做的项目,接口有什么用?
我从项目中使用的感觉来看,接口是一种约束,就是说你使用了接口,你非得接受这个约束 ,实例是这样的,我在项目的底层使用的是第三方的控件,每个实体类都少一个字段,这个字段是用来标志表名的,用tablename来标志这个字段,好了现在一个实体类里面加了tablename字段,另外一个实体类里面也加了tablename字段,这样为每个实体类都加上这个字段,这样也是对的,只要程序员的觉悟好就行,但也有可能会把tablename写成tablename1,当然关系也不大,但总给人怪怪的感觉,如果继承一个统一的接口的话,那么所有表名字段只能用tablename来表示了.