C#中的接口

时间:2010-10-02 03:08:15

标签: c# interface

我正在寻找C#中接口的一个非常简单的解释。我一直在问谷歌,但我得到的答案非常技术性和措辞,程序员可能会理解。它几乎听起来像是一个可以调用以执行函数的方法,它允许程序员使用较少的击键。

从我在下面阅读的内容来看,接口是一种创建方法容器的方法,该方法使用不同的技术执行相同的操作。

我想知道它们是什么?他们做什么?我可以用它们做什么?

6 个答案:

答案 0 :(得分:9)

  

......以程序员可能的方式措辞   理解。

如果您不是程序员,那么理解界面会遇到一些麻烦。如果不能很好地理解基本的面向对象原则,这可能看起来有点令人困惑。但是事后:

接口类似于类,但不是告诉你的对象,而是告诉你做了什么

例如,一个非常常见的界面是IEnumerable。当一个类实现该接口时,这意味着该对象可以创建并返回Enumerator,这可以由代码的其他部分(通常是foreach循环或LINQ使用)查询)。

你可能会看到的另一个是IDisposable。这意味着您在对象上调用.Dispose()调用它将清理资源。它没有说明它将清理什么资源或者对象是什么 - 它可以是StreamReaderSqlConnection或其他东西。它说的是它有一个名为Dispose的方法。

接口是非常有用的概念。如果你有很多非常不同的类但是有一些共同的行为,那么你可以让它们都实现一个接口,然后将它们作为一个接口进行操作。例如,如果您有一个界面:

interface ICanPrintMyContents
{
    void PrintContents();
}

然后是一堆实现它们的类:

class ParkingGarage : ICanPrintMyContents { ... }
class UnimpressivePolitician : ICanPrintMyContents { ... }
class BankingSimulation : ICanPrintMyContents { ... }

你可以将它们全部放在一个列表中,即使它们的类之间没有真正的关系。

List<ICanPrintMyContents> list = { theGarage, insertNameHere, sim1, anotherGarage };
foreach(ICanPrintMyContents item in list)
    list.PrintContents();

(注意:ICan...命名约定没有被广泛使用,我也不建议。很多人不喜欢它,但我在这里使用它是因为它传达了界面的含义非常好。更常见的是IPrintableContents或其他东西)

答案 1 :(得分:7)

想象一下,你有一家比萨饼店(我从着名的设计模式书中偷了这个例子)。你知道所有比萨都需要订购,准备,烘焙和装箱。好吧,您可以将这种常见行为定义到界面中:

public interface IPizza
{
   void Order();
   void Prepare();
   void Bake();
   void Box();
}

让你的不同种类的比萨饼实现这个界面。实现接口时,您强制该类具有与接口相同的方法和参数,例如:

public class PepperoniPizza : IPizza
{
   public void Order()
   {
       //Order Pepperoni pizza
   }

   public void Prepare()
   {
       //Prepare Pepperoni pizza
   }

   public void Bake()
   {
       //Bake Pepperoni pizza
   }

   public void Box()
   {
       //Box Pepperoni pizza
   }
}

你几乎和夏威夷,奶酪或任何其他比萨饼一样。

在现实生活中,接口有几种用途。您可以创建合同以扩展应用程序,或确保它适用于不同的情况。

希望这有帮助

答案 2 :(得分:1)

这只是一份合同;在某种意义上,“实现”接口的特定类应具有接口定义的所有属性和方法。在那些属性/方法中,您可以编写任何代码,但人们通常会编写执行特定操作的代码。

例如采用垃圾收集的概念:如果您关注控制对象释放内存的方式,那么您将实现IDisposable接口。此接口公开Dispose()方法。虽然程序员为Dispose()编写代码,但他们实际上从未在代码中调用它。该框架为您做到了。

你必须从这个角度来看待它。框架不需要了解自定义类对象的详细信息。但是只要它能够理解该类对象实现了这个接口,就可以调用它上面的Dispose()方法,并执行那里的任何代码;在这种情况下垃圾收集代码。

垃圾收集是一个非常密集的主题。但我所解释的只是刮掉了表面。现在,如果您真的想看到界面在运行,您应该尝试研究.net远程处理。它是另一个密集的话题,但它会帮助你理解。

答案 3 :(得分:1)

接口是合同。没有实现的声明。它们用于松耦合,可测试性和DI。

这是一个简单的真实世界的例子(不是猫和狗) 假设您想为您的应用提取一些数据。您可以像这样创建IRepository接口

public Interface IProductRepository
{
   public IList<Product> GetAllProducts()
}

比你实现这个用一些返回硬编码假数据的类(用于测试)

public class FakeProductRepository : IProductRepository
{
  public IList<Product> GetAllProducts()
  {
     // create some fake product list and return it
  }
}

假设您正在创建一个控制台应用。在您的主要功能中,您可以执行此操作

  IProductRepository repository = new FakeProductRepository()

并测试你的逻辑

一旦你感到满意,你可以拥有一个“Real”ProductRepository类来实现该接口,并将数据从“实时”数据库中提取出来

答案 4 :(得分:0)

我将指出您之前使用类比概念性地描述接口的答案:Why do we use Interface? Is it only for Standardization?

答案 5 :(得分:0)

随着 Arturo Molina 的更新,这里是更新的界面成员

public interface IPizza
    {
       void Order();
       void Prepare();
       void Bake();
       void Box();
    }

注意:由于接口成员默认是公开的,因此无需明确提及访问修饰符,它也不会接受。