为什么我们应该实现接口?

实现接口只提供方法的框架。 如果我们知道该方法的确切签名行,在这种情况下
实现接口的要求是什么?
这是实现接口的情况

interface IMy { void X(); } public class My:IMy { public void X() { Console.WriteLine("Interface is implemented"); } } 

这是Interface尚未实现的情况

 public class My { public void X() { Console.WriteLine("No Interface is implemented "); } } 

 My obj = new My(); obj.X(); 

这两种方法都会产生相同的结果。
实现接口的要求是什么?

.net中有两个inheritance目的:

  1. 允许派生类共享通用function的基类实现
  2. 允许派生类对象替换接受后者的任何地方的基类对象。

与允许多重inheritance的某些语言(例如C ++)不同,.net要求每个类只有一个父类型(Object,如果没有别的话)。 另一方面,有时候让一个类可以替代许多不相关的类型是有用的。 这就是接口的用武之地。

实现接口的对象可以替代该声明的接口类型的实例。 即使对象只能从一种基类型inheritance,它们也可以实现任意数量的接口。 因此,这允许多重inheritance的一些function,而没有完全多重inheritance支持的复杂性和缺点。

接口的目的是允许您使用两个不同的类,就好像它们是相同的类型一样 。 当涉及到关注点分离时,这是非常宝贵的。

例如,我可以编写一个从IDataReader读取数据的方法。 我的方法不需要知道(或关心)是否是SqlDataReader,OdbcDataReader或OracleDataReader。

 private void ReadData(IDataReader reader) { .... } 

现在,假设我需要该方法来处理来自非标准数据文件的数据。 我可以编写自己的对象来实现IDataReader,它知道如何读取该文件,我的方法再次,既不知道也不关心IDataReader是如何实现的,只是它传递了一个实现IDataReader的对象。

希望这可以帮助。

您可以编写多个实现接口的类,然后将它们中的任何一个放在接口类型的变量中。
这允许您在运行时交换实现。

List持有不同的实现也很有用。

这是一个简单的例子,帮助我理解界面:

 interface IVehicle { void Go(); } public class Car:IVehicle { public void Go() { Console.WriteLine("Drive"); } } public class SuperCar:IVehicle { public void Go() { Console.WriteLine("Drive fast!!"); } } IVehicle car = new Car(); car.Go(); //output Drive car = new SuperCar(); car.Go(); //output Drive fast!! 

您已经提供了一个非常基本的示例,这可能是您无法理解原因的原因。 检查这样的事情:

 public interface IDbColumn { int domainID { get; set; } } public static IEnumerable GetDataByDomain( IQueryable src) where T:IDbColumn { string url = HttpContext.Current.Request.Url.Host; int i = url == "localhost" ? 1 : 2; return src.Where(x => x.domainID == i|| x.domainID == 3); } 

domainID是每个表中将引用此方法的物理列,但由于表类型尚不可知,因此没有接口就无法访问该变量。

假设你有三个class,A,B,C。

需要接受一个论点。 B或C都可以通过。

最好的方法是创建一个B和C共享的接口

好的接口并不仅仅用于一个类,它们被用于许多类以确保它们包含一组方法。

可视化它的一个好方法是考虑驱动程序抽象,能够运行1个可由多个不同数据库服务器互操作的查询。

 interface DatabaseDriver { public function connect(ConnectionDetails $details){} public function disconnect(){} public function query(Query $query){} public function prepareQuery(SQLQuery $query){} } 

然后您的实际驱动程序将使用该接口,以便数据库对象可以确保所选驱动程序能够执行所需的任务。

 class MySqlDriver extends Database implements DatabaseDriver{} class AccessDriver extends Database implements DatabaseDriver{} class MsSqlDriver extends Database implements DatabaseDriver{} 

希望这可以帮助。

注意:PHP代码