<script language="javascript" src="/ad/js/edu_left_300-300.js" type="text/javascript"></script> | 关于接口调用类的: 接口是用来通信的,不同的对象/模块通过接口来通信 例如下面这个函数要使用某个对象A,可以这样做 void f(A a); 也可以这样做 void f(IA a); 显然第二种的好处是,它不依赖于A的具体实现,而且对函数f也屏蔽了A中的一些其它的东西,这样也有得于安全编程 接口接口,正如其名,有的时候你只需要通过接口调用类中的方法,而不需要考虑具体的类。换句话说就是不需要知道类的内部构造。正如楼上所说的电源插座,你只管插,不需要知道里面的电线。 针对接口编程能帮助达到面向对象开发和设计中"低耦合"的要求. 举个例子:某公司有一台特殊打印机,还可以使用一年,一年后可能换为另一种打印机,这两种打印机都特殊而贵.所以现在的程序希望换了打印机后也少量修改就可用. 方法: 1,定义一个打印机接口. 2,定义打印机类A,B,分别实现此接口. 3,定义一个工厂类,在类中可选择返回由A实现的接口,或者由B实现的接口. 4,在程序中使用打印机时,就可以使用工厂类来调用打印机,而不需要知道具体的是什么打印机. 如果打印机换了,只需要修改工厂类就行了.如果有一千个地方都调用过打印机,就不需要一个一个修改.修改一个地方就行了.接口充当一个隔离层的作用. //定义打印机接口 interface Iprint{ bool PrintData(string data); } //定义打印机类A,实现接口 class PrintA:Iprint{ public virtual bool PrintData(string data){ //具体业务逻辑略 } } 定义打印机类B,实现接口 class PrintB:Iprint{ public virtual bool PrintData(string data){ //具体业务逻辑略 } } //定义工厂类 class PrintFactory{ public Iprint CreatePrint(){ //返回一个由打机类A,或B实现的接口,比如 return new PrintA(); } } //通过工厂类,调用打印机 private void button1_Click(object sender,EventArgs e){ PrintFactory myFactory=new PrintFactory(); Iprint myPrint=myFactory.CreatePrint(); myPrint.PrintData("这样做很方便啊"); }
C#中的接口
目录
接口的定义
接口与抽象类
接口的的实现
接口的的多态性
一.接口的定义 举个例子来说明一下。 有两个抽象类,car和train,,汽车和火车 下面还有许多类,比如公交车,卡车等都派生于汽车 客车,货车都派生于火车 在car,train中公别定义了汽车与火车的一 些主要特性。 自然的,它们的派生类就拥有这样的特性, 但是汽车下的公交车,火车下的客车都可以乘载客人,所以这两个类可以共同实现一个拥有乘载客人功能的接口,而卡车与货车可以共同实现一个拥有运载货物的接口。 一个类支持一个接品,就必须实现它所有的成员 interface IMyinterface { void Dosomething(); void Doelsething(); } class Myclass:IMyinterface { void IMyinterface.Dosomething() { Console.WriteLine("1"); } public virtual void Doelsethiing() {
Console.WriteLine("2"); }
} class Myclass2:Myclass { public override void Doelsething() { Console.WriteLint(“3“); } }
上面定义了一个接口IMyinterface, Myclass实现了这个接口, 这样,派生于Myclass的类Myclass2也就默认的支持这个接口,也继承了对方法的实现,在Myclass2中,还可以对Doelsething方法进行重写。 但这是有前提的。那就是Doelsething方法是由Myclass类隐式实现的。隐式实现只须匹配方法返回值和方法签名即可。这样的方 法,可以使用关健字vritual 和 abstract来修饰,而且可以用类的实例类调用 class obj=new Myclass(); obj.Doelsethiing();
而第一个方法Dosomething是显式执行的。它只能由接口的引用变量来调用。而且派生类不会继承这个方法的实现,所以上面的Myclass2类也要再加一个这个方法的实现 ,因为它继承了Myclass,就默 认的支持这个接口。
定义:定义一个协定。实现接口的类或结构必须遵守其协定。
简单的说就是接口或者类之间交互时遵守的一个显示定义。最初接触“类与类之间通过接口交互”这个概念时,误以为接口就是类公开的方法,类之间通过类的方法进行交互。其实接口是独立于类的一个定义。接口定义类之间交互的标准。
那么类与类之间直接交互就好了,为什么还要使用接口呢?
这主要是因为:接口是类之间交互内容的一个抽象,把类之间需要交互的内容抽象出来定义成接口,可以更好的控制类之间的逻辑交互。可见接口内容的抽象好坏关系到整个程序的逻辑质量;另外可以在任何时候通过开发附加接口和实现来添加新的功能;
关于接口一个很重要的概念:接口只包含成员定义,不包含成员的实现,成员的实现需要在继承的类或者结构中实现。
接口的成员包括:方法,特性,索引器,事件。
注意:接口不包含字段。
实现接口的类必须严格按其定义来实现接口的每个方面
接口本身一旦被发布就不能再更改,对已发布的接口进行更改会破坏现有的代码。
一个典型的接口示例:
using System;
using System.Colletion;
public delegate voic Chang(object sender,object event)//定义一个委托
public interface Ibroker //定义一个股票经济人接口
{
string GetRating (string stock);//一个获得金额的方法(此处没有实现)
decimal pricePerTrade //定义一个设置每股价格的特性
{
get; //没有实现的
set;
}
decimal this(string StockName) //定义索引器
{
get;
set;
}
event Change pricechange; //定义接口的事件
}
二.接口与抽象类
抽象类和接口在定义上和功能上有很多相似的地方,具体在程序中使用抽象类还是接口需要比较抽象类和接口的具体差别。
抽象类:一种不能实例化而必须从中继承的类,抽象类可以提供实现,也可以不提供实现
子类只能从一个抽象类继承
抽象类应主要用于关系密切的对象
如果要设计大的功能单元,则使用抽象类。
如果预计要创建组件的多个版本,则创建抽象类
接口:是完全抽象的成员集合,不提供认识实现。
类或者结构可以继承几个接口。
接口最适合为不相关的类提供通用功能
如果要设计小而简练的功能块,则使用接口
接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口
三.接口的的实现
接口的实现分为:隐式实现和显式实现。如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显示实现。显示实现是通过使用接口的完全限定名来实现接口成员的。
针对上面的例子 我们可以这样实现接口:
public class testInterface: Ibroker //定义一个继承ibroker接口的类
{
hashtable hash=new hashtable();
decimal pricepertrade;
public testInterface(decimal price) // 构造函数
{
pricepertrade=price ; //初始化字符串
}
public string Getrating (string stock) //隐式实现接口的方法
{
return “buy”;
}
public decimal Ibroker.pricepertrade // 显式实现接口的特性
{
get
{
return pricepertrade;
}
set
{
pricepertrade=value;
pricechange(“Finacebroker”,value);
}
public decimal this(string stockName)
{
get
{
return (decimal)Hash[stockName];
}
set
{
hash.add(stockname,value);
}
}
}
public event changer pricechange;//接口中的所有成员都要实现
}
四.接口中的多态
多个类继承了相同的接口就实现了接口的多态性,接口的多态性的访问和类的多态性访问一样。下面的例子说明怎么实现接口的多态性访问:
public class InterfaceTester
{
public stratic int Main (string[] args)
{
string recommendation;
Arraylist Brokers=new Arraylist;//定义一个列表
Brokers.add(new firstBroker(7.21m));//添加第一个继承接口的类
Brokers.add(new secondBroker(12.3m));// 添加第二个继承接口的类
InterfacetTester new Iftst=new InterfacetTester
Foreach (Ibroker broker in Brokers)
{
broker.pricechange+=new change(iftst.pricepertradechange);
broker[“adc”]=12.33m;
broker[“rty”]=11.23ml
broker.pricepertrade=12.55m;
}
}
}
|