可能重复:
Why would I want to use Interfaces? Why I need Interface?
我想知道何时何地使用它?
例如,
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?");
}
这两个类具有相同的函数名称和不同的主体。 没有接口,甚至可以实现这一点。 那么为什么我们需要一个接口何时何地使用它?
答案 0 :(得分:1)
在您的简单情况下,您可以通过使用实现show()
的公共基类(或者可能将其定义为抽象)来实现与接口相似的操作。让我将您的通用名称更改为更具体的名称, Eagle 和 Hawk ,而不是 MyClass1 和 MyClass2 。在这种情况下,您可以编写类似
Bird bird = GetMeAnInstanceOfABird(someCriteriaForSelectingASpecificKindOfBird);
bird.Fly(Direction.South, Speed.CruisingSpeed);
这使您可以编写可以处理是 * Bird *的任何内容的代码。然后,您可以编写导致 Bird 执行此操作的代码(飞行,吃饭,产蛋等等),这些代理会作用于 Bird 的实例。无论 Bird 是 Eagle , Hawk ,还是从 Bird 派生的任何其他内容,该代码都能正常工作。< / p>
然而,当你没有真正的是关系时,这种模式开始变得混乱。假设您想编写在天空中飞行的代码。如果您编写该代码以接受 Bird 基类,则突然变得很难将该代码发展为 JumboJet 实例,因为当 Bird 和 JumboJet 当然都可以飞, JumboJet 肯定不是 Bird 。
输入界面。
Bird (以及 Eagle 和 Hawk )做的共同点是,他们都可以飞。如果您编写上述代码而不是作用于接口 IFly ,则该代码可以应用于为该接口提供实现的任何内容。
答案 1 :(得分: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
,在这种情况下,所有外星人都来自外太空。不是所有外星人都完全相同,但他们都消耗食物和使用能量。他们消费食物和使用能量的方式可能不同,但保留一个基础Alien
类,并且具有抽象远离该类的接口比为每种类型具有单独的类更有意义。
核心逻辑可以在基类中保持相同,并且接口可以在需要时更改部件。
答案 2 :(得分: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的任何实现,并且它完全不知道记录器实际上记录了什么。
编程接口的另一个好处是它允许更容易的单元测试。 通过注入一个也可以实现接口的模拟记录器,可以轻松地对控制器进行单元测试。