我一直试图了解实际上是什么接口,理论上我已经很好地理解了这个定义。但是当涉及到实际使用它们时,我会想到一些问题。
大多数资源以这种方式定义界面:
“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;
}
}
现在我必须有一个使用过此蓝图或合约的课程。那么在一张纸上写这个蓝图和制作界面会有什么区别呢?
答案 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
- 您将始终能够将它们传递给您的测试执行者。