我们为什么要实现接口?

时间:2011-05-23 14:01:04

标签: c# oop interface

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

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();

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

7 个答案:

答案 0 :(得分:6)

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

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

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

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

希望这有帮助。

答案 1 :(得分:5)

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

List<ISomeInterface>持有不同的实现方式也很有用。

答案 2 :(得分:3)

.net中有两个继承目的:

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

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

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

答案 3 :(得分:2)

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

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!!

答案 4 :(得分: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是每个表中将引用此方法的物理列,但由于表类型尚不可知,因此没有接口就无法访问该变量。

答案 5 :(得分:0)

假设您有三个班级,A,B,C。

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

执行此操作的最佳方法是创建B和C共享的接口

答案 6 :(得分: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中的代码

相关问题