Вы не создаете экземпляр интерфейса - вы создаете экземпляр чего-то, что реализует интерфейс.
Смысл интерфейса в том, что он гарантирует, что то, что когда-либо реализует, будет предоставлять методы, объявленные в нем.
Так что теперь, используя ваш пример, вы можете получить:
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();
}