您不是在创建接口的实例 - 您是在创建实现接口的实例。
接口的关键在于它保证实现它的任何东西都将提供其中声明的方法。
所以现在,使用您的示例,您可以:
MyNiftyClass : IMyInterface
{
public void CallSomeMethod()
{
//Do something nifty
}
}
MyOddClass : IMyInterface
{
public void CallSomeMethod()
{
//Do something odd
}
}
现在你有:
IMyInterface nifty = new MyNiftyClass()
IMyInterface odd = new MyOddClass()
现在调用 CallSomeMethod 方法会做一些漂亮或奇怪的事情,当您使用 IMyInterface 作为类型传入时,这将变得特别有用。
public void ThisMethodShowsHowItWorks(IMyInterface someObject)
{
someObject.CallSomeMethod();
}
现在,根据你是用漂亮的类还是奇怪的类调用上述方法,你会得到不同的行为。
public void AnotherClass()
{
IMyInterface nifty = new MyNiftyClass()
IMyInterface odd = new MyOddClass()
// Pass in the nifty class to do something nifty
this.ThisMethodShowsHowItWorks(nifty);
// Pass in the odd class to do something odd
this.ThisMethodShowsHowItWorks(odd);
}
编辑
这解决了我认为您的预期问题 - 为什么要将变量声明为接口类型?
也就是说,为什么要使用:
IMyInterface foo = new MyConcreteClass();
优先于:
MyConcreteClass foo = new MyConcreteClass();
希望在声明方法签名时使用接口的原因很清楚,但这留下了关于局部范围变量的问题:
public void AMethod()
{
// Why use this?
IMyInterface foo = new MyConcreteClass();
// Why not use this?
MyConcreteClass bar = new MyConcreteClass();
}
通常没有技术原因为什么首选该界面。我通常使用界面,因为:
- 我通常会注入依赖项,因此需要多态性
- 使用界面清楚地表明我打算只使用界面的成员
技术上需要接口的一个地方是使用多态性的地方,例如使用工厂创建变量或(如上所述)使用依赖注入。
从 itowlson 借用一个例子,使用具体声明你不能这样做:
public void AMethod(string input)
{
IMyInterface foo;
if (input == "nifty")
{
foo = new MyNiftyClass();
}
else
{
foo = new MyOddClass();
}
foo.CallSomeMethod();
}