使用接口,实际和现实世界的例子

时间:2013-12-13 21:51:28

标签: c# interface

我一直试图了解实际上是什么接口,理论上我已经很好地理解了这个定义。但是当涉及到实际使用它们时,我会想到一些问题。

大多数资源以这种方式定义界面:

“An interface is a contract between itself and any class that implements it. This contract states that any class that implements the interface will implement the interface's properties, methods and/or events. An interface contains no implementation, only the signatures of the functionality the interface provides. An interface can contain signatures of methods, properties, indexers & events.”

这很容易理解,但我的问题是,如果接口是(根据这个定义)他们自己和类之间的某种蓝图或契约,如果我定义这个接口会发生什么,

interface ITest {
    int SomeTestVariable { set; get;}
    int SomeTestMethod ();    
}

创建一个实现此接口的类及其所有方法

class Test: ITest {
    int SomeTestvariable { set; get;}
    int SomeTestMethod () {
        return 1;
    }   
}

并且在实施了所有方法和属性之后,我将其删除。

class Test {
    int SomeTestvariable { set; get;}
    int SomeTestMethod () {
        return 1;
    }   
}

现在我必须有一个使用过此蓝图或合约的课程。那么在一张纸上写这个蓝图和制作界面会有什么区别呢?

2 个答案:

答案 0 :(得分:8)

优点是您可以编写接口,并在任何人编写实现之前编写使用接口的代码

当然,如果你已经拥有了唯一一个在你使用该接口之前实现接口编码的类,那么界面对你没有好处,但是如果你还没有编写实现的话呢(同时考虑一下有多种类型正在实现接口)?

一个简单的例子就是编写一个简单的Sort方法。我可以为每种可能的数据类型编写一个Sort实现,或者我可以编写一个排序方法,假设每个项都实现了一个IComparable接口,并且可以自我比较。然后我的Sort方法可以在您编写要比较的对象之前很久就使用该接口编写代码。

答案 1 :(得分:6)

Servy的答案是一个可靠的解释,但是 - 正如你要求的例子 - 我将把你的界面扩展到一个可以想象的(如果有点做作的)场景。

假设您的界面ITest已到位(我已偷偷地切换SomeTestMethod以在我的示例中返回一个bool)。我现在可以有两个不同的类:

// Determines whether an int is greater than zero
public class GreaterThanZeroTest : ITest
{
    public int SomeTestVariable { get; set; }

    public bool SomeTestMethod()
    {
        return SomeTestVariable > 0;
    }
}

// Determines whether an int is less than zero
public class LessThanZeroTest : ITest
{
    public int SomeTestVariable { get; set; }

    public bool SomeTestMethod()
    {
        return SomeTestVariable < 0;
    }
}

现在让我们说我们有一个单独的类来运行测试。我们可以使用以下方法:

public bool RunTest(ITest test)
{
    return test.SomeTestMethod();
}

也许这个方法被这个类的其他成员调用,用于批量运行测试,生成统计信息等。

现在,您可以创建各种“测试”类。这些可以是任意复杂的,但是 - 只要它们实现ITest - 您将始终能够将它们传递给您的测试执行者。