2012-08-05 34 views
-1

可能重复:
Why would I want to use Interfaces? Why I need Interface?当我们需要接口C#

我想知道在哪里以及何时使用它?

例如,

interface IDemo 
{ 
// Function prototype 
public void Show(); 
} 

// First class using the interface 
class MyClass1 : IDemo 
{ 
public void show() 
{ 
    // Function body comes here 
    Response.Write("I'm in MyClass"); 
} 
} 

// Second class using the interface 
class MyClass2 : IDemo 
{ 
public void show() 
{ 
    // Function body comes here 
    Response.Write("I'm in MyClass2"); 
    Response.Write("So, what?"); 
} 

这两类具有不同的身体的相同的函数名。 这甚至可以在没有界面的情况下实现。 那么为什么我们需要一个界面何时何地使用它?

+2

请使用代码格式化按钮“{}”。 – Marlon 2012-08-05 06:17:48

+2

你的例子太泛用了。您不会仅仅因为两个类具有相似的方法名称而对继承进行建模。 – Eranga 2012-08-05 06:22:31

+1

这是为什么这个关闭的问题完全重复**到自己关闭的问题**? – 2012-08-05 06:29:29

回答

0

这里有几个很好的链接。

http://www.daniweb.com/software-development/csharp/threads/114364/why-use-interfaces

http://fci-h.blogspot.com/2008/03/oop-design-concepts-interfaces_05.html

精化:基本上它们提供更多的抽象。如果你有一个对象说Alien,在这种情况下,所有的外星人都来自外太空。那么并非所有的外国人都是完全一样的,但他们都消耗食物和使用能量。他们消费食物和使用能量的方式可能会有所不同,但要保留一个基类,并且具有抽象出该类的接口比每个类型具有单独的类更有意义。

核心逻辑可以在基类中保持相同,接口可以在需要时更改部分。

+0

我懒惰的原因是因为任何人都可以做一个快速谷歌,并阅读有关“为什么接口”的解释。 – edhedges 2012-08-05 06:29:25

1

在你的简单情况下,你可以通过使用实现show()(或者可能将其定义为抽象)的通用基类实现类似于通过接口获得的东西。让我改变你的通用名称,以更具体的东西,而不是MyClass1的MyClass2。在这种情况下,你可以写像

Bird bird = GetMeAnInstanceOfABird(someCriteriaForSelectingASpecificKindOfBird); 
bird.Fly(Direction.South, Speed.CruisingSpeed); 

可以让你写的代码,可以处理任何 *鸟*代码。然后,你可以编写代码,使Bird做它的事情(飞,吃,下蛋,等等),它会作为一个的行为。该代码将工作是否真的是一个,或其他任何东西,从派生。

这种范例开始变得混乱,但是,当你没有真正的的关系。假设你想编写能够在天空中飞行的代码。如果你写的代码,以接受基类,它突然变得难以发展该代码在JumboJet情况下工作,因为当一个JumboJet可以肯定两者飞,一个JumboJet肯定不是

进入界面。

什么(和的共同点是,他们都可以飞。如果您编写上述代码而不是在接口上执行操作,则该代码可以应用于为该接口提供实现的任何内容。

0

当您拥有相互依赖的组件时,主要需要接口。 一个常见的例子是一个日志记录控制器和一些记录器类。

class LoggingController { 

    private ILogger _logger 

    // expecting an interface here removes the dependency 
    // to a specific implemenentation. 
    // all it cares about is that the object has a Log() method 
    public LoggingController(ILogger logger) { 
     _logger = logger; 
    } 

    public void Log() { _logger.Log(); } 
} 

interface ILogger { 
    void Log(); 
} 

class DbLogger : ILogger { 
    public void Log(){ //log into db } 
} 

class TxtLogger : ILogger { 
    public void Log(){ //log into a txt file } 
} 

在运行时,日志记录控制器可以与ILogger的任何实施注射,这是完全不知道什么样的记录器实际上做实际登录的东西。

编程接口的另一个好处是它可以使单元测试更简单。 控制器可以通过注入模拟记录器来轻松进行单元测试,模拟记录器也可以实现接口。

+0

我可以问为什么这是downvoted?如果有什么不对的地方,我更喜欢解释和修正...... – Pinetree 2012-08-05 06:31:49

相关问题