2010-05-11 23 views
2

有人可以解释C#中接口的确切使用吗?有人可以解释C#中接口的确切使用吗?

+2

它们使接口更容易。 – 2010-05-11 05:10:57

+1

“解释”有趣的错字(对我们美国人来说) – 2010-05-11 05:12:29

+1

可能的重复[如何知道何时创建界面?](http://stackoverflow.com/questions/444245/how-will-i-know-when-to-create-an-interface) – 2010-05-11 06:41:58

回答

2

这已经在这里讨论了很多次,在过去,这是很难挑选任何一个重复了这个问题。

为了节省重复之前所说的话的时间,并开始检查结果。

0

用最简单的术语来说,接口表示一个或多个类可以做什么,尽管在各种类中implimentation可能会有所不同。

+1

必须做,不可以做。 – 2010-05-11 05:22:02

0

Polymorphism 您可以使用2个类来实现相同的接口,而不必确切地知道它是哪个具体类。它有助于保持代码松耦合。

+0

详细一点会有所帮助! – user337911 2010-05-11 05:24:47

2

想象一下拥有一家生产汽车的工厂的情况。你知道,每部车辆具有发动机和能够启动,所以你具备以下条件:

interface IVehicle 
{ 
    Engine vehicleEngine { get; set; } 

    bool StartEngine(); 
} 

现在,工厂生产的其他车辆的阵列,所以例如卡车和普通汽车:

public Car : IVehicle 
{ 
    // MUST implement vehicleEngine and StartEngine: 

    public Engine vehicleEngine { get; set; } 

    public bool StartEngine() 
    { 
     // Cars needs to do xyz to start 
    } 

    public int MaxNumberOfPassenger { get; set; } // Specific to Car 
} 

然后:

public Truck : IVehicle 
{ 
    // MUST implement vehicleEngine and StartEngine: 

    public Engine vehicleEngine { get; set; } 

    public bool StartEngine() 
    { 
     // Trucks needs to do abc to start 
    } 

    public int MaximumLoad { get; set; } // Specific to Truck 
} 

因此,这迫使所有车辆实行特定的成员落入车辆的范畴,但随后也可以专门用自己独特的成员。

+0

在这里,我应该在接口中签署这些方法,然后在我的课程中实现 ?我可以直接在我的课堂上做,而不是使用界面? – user337911 2010-05-11 05:33:15

+1

所以你可以绕过一辆汽车或一辆卡车,当你通过的时候并不重要。 TestTheVehiclesEngine(IVehice theVehicle){theVehicle.StartEngine(); } - 无论是汽车还是卡车都无所谓,因为它们都实现了IVehicle,因此都采用StartEngine方法。查找多态性 – 2010-05-11 05:48:17

+0

使用接口的另一个原因是它允许你将设计从你的实现中解耦出来并使你的代码可测试。如果你的类在构造函数中要求一个接口,而不是具体的实现,你可以换掉你的具体类来模拟。 – 2010-05-11 21:06:59

0

接口定义了可以实例化的类必须实现的最低要求。它通过方法表达了这一点。

例如,接口可以定义一个称为富函数,它接受一个整数,并返回一个布尔值:

public interface ICanFoo 
{ 
    bool Foo(int number); 
} 

实现该接口还必须实现此方法的任何类:

public class Fooable : ICanFoo 
{ 
    public bool Foo(int number) 
    { 
     // do something 
    } 
} 

方法中的实现取决于正在实现接口的特定类。

通过使用接口,您不再关心实现是编译时间,而是规范。你可以这样调用:

ICanFoo myFooable = ... 
bool success = fooable.Foo(4); 

fooable的实际类型可以是实现ICanFoo因为你知道这ICanFoo总是定义为Foo方法的方法实现任何类。