【问题标题】:Why we should implement Interface?为什么要实现接口?
【发布时间】:2011-05-23 14:01:03
【问题描述】:

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

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

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

【问题讨论】:

标签: c# oop interface


【解决方案1】:

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

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

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

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      .net 中继承有两个目的:

      1. 允许派生类共享通用功能的基类实现
      2. 允许派生类对象替换基类对象,只要后者可以接受。

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

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

      【讨论】:

        【解决方案4】:

        这是帮助我理解接口的简单示例:

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

        【讨论】:

          【解决方案5】:

          您提供了一个非常基本的示例,这可能就是您无法理解原因的原因。检查如下内容:

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

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

              接口并不意味着只与一个类一起使用,它们用于许多类以确保它们包含一组方法。

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

              【讨论】:

              • 只有一个接口的生产实现是完全合理的,IMO。它放松了类之间的耦合,并且意味着(使用模拟框架)您可以测试完全独立于实现而使用接口的组件。
              猜你喜欢
              • 2011-02-12
              • 2011-05-05
              • 2010-09-29
              • 1970-01-01
              • 1970-01-01
              • 2018-07-19
              • 1970-01-01
              相关资源
              最近更新 更多