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

4

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

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

这是未实现接口的情况。

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


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

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


4
你可以尝试浏览http://stackoverflow.com/questions/tagged/interface?sort=faq,你就会知道接口为什么很有用。 - Thomas Li
7个回答

6
接口的目的是允许您将两个不同的类视为相同的类型。这在关注点分离方面非常有价值。
例如,我可以编写一个从IDataReader读取数据的方法。我的方法不需要知道(或关心)它是SqlDataReader、OdbcDataReader还是OracleDataReader。
private void ReadData(IDataReader reader)
{
....
}

现在,假设我需要这个方法来处理来自非标准数据文件的数据。我可以编写自己的对象,实现IDataReader接口,并知道如何读取该文件,而我的方法不知道也不关心IDataReader是如何实现的,只知道它被传递了一个实现了IDataReader接口的对象。
希望这能帮到你。

5
你可以编写多个实现接口的类,然后将它们中的任何一个放入接口类型的变量中。
这样可以在运行时交换实现。
拥有一个持有不同实现的List<ISomeInterface>也很有用。

3
在 .net 中,继承有两个目的:
  1. 允许派生类共享基类实现的常见功能
  2. 允许派生类对象替换任何接受后者的基类对象。
与某些语言(例如 C++)允许多重继承不同,.net 要求每个类都有且只有一个父类型(如果没有其他类型,则为 Object)。另一方面,有时候需要将类替换为多个不相关类型。这就是接口的作用。
实现接口的对象可以替代声明的接口类型的实例。即使对象只能从一个基类型继承,它们也可以实现任意数量的接口。因此,这提供了多重继承的一些功能,而不会出现完全多重继承支持的复杂性和缺点。

1

您提供了一个非常基本的例子,这可能是您难以理解原因的原因。请看以下示例:

public interface IDbColumn
    {
        int domainID { get; set; }

    }

    public static IEnumerable<T> GetDataByDomain<T>(
        IQueryable<T> 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 是每个表中的物理列,将引用此方法,但由于表类型尚未知晓,因此没有办法在没有接口的情况下访问该变量。


1
这是一个简单的例子,帮助我理解接口:
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!!

0

接口并不是为了仅在一个类中使用,而是用于许多类中,以确保它们包含一组方法。

一个很好的可视化方式是考虑驱动程序抽象,能够运行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代码。

在我看来,只有一个生产接口实现是完全合理的。它可以减少类之间的耦合,并且意味着(使用模拟框架)您可以完全独立地测试使用接口的组件而不涉及实现。 - Jon Skeet

0
假设你有三个类,A、B、C。
A需要接受一个参数,可以传递B或C。
最好的方法是创建一个B和C共享的接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接