您不是在创建接口的实例 - 您是在创建实现该接口的实例。
接口的要点在于,它保证无论实现什么,都将提供在其中声明的方法。
所以现在,使用您的示例,您可以:
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);
}
EDIT
这解决了我认为您想要的问题:为什么要将变量声明为接口类型?
也就是说,为什么使用:
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();
}