Когда нам нужен интерфейс С#

Возможный дубликат:
Почему я хочу использовать интерфейсы? Зачем мне нужен интерфейс?

Я хочу знать, где и когда его использовать?

Например,

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?");
 }

Эти два класса имеют одно и то же имя функции с другим телом. Этого можно добиться даже без интерфейса. Тогда зачем нам нужен интерфейс, где и когда его использовать?

Ответ 1

В вашем простом случае вы можете достичь чего-то похожего на то, что получаете с интерфейсами, используя общий базовый класс, который реализует show() (или, возможно, определяет его как абстрактный). Позвольте мне изменить ваши общие имена на нечто более конкретное, Eagle и Hawk вместо MyClass1 и MyClass2. В этом случае вы можете написать код типа

Bird bird = GetMeAnInstanceOfABird(someCriteriaForSelectingASpecificKindOfBird);
bird.Fly(Direction.South, Speed.CruisingSpeed);

Это позволяет писать код, который может обрабатывать все, что есть * Bird *. Затем вы можете написать код, который заставляет птицу делать это (летать, есть, откладывать яйца и т.д.), Что действует на экземпляр, который он рассматривает как птицу. Этот код будет работать, будь то птица - это Орёл, Ястреб или что-то еще, что происходит от Птицы.

Эта парадигма начинает запутываться, хотя, когда у вас нет истины, это отношения. Скажите, что вы хотите написать код, который летает вокруг в небе. Если вы напишете этот код, чтобы принять базовый класс Bird, то внезапно становится сложно развить этот код для работы с экземпляром JumboJet, потому что, хотя Bird and JumboJet, безусловно, может летать, JumboJet, безусловно, не является птицей.

Введите интерфейс.

У какой птицы (и Eagle, и Hawk) есть общее, что они могут летать. Если вы напишете вышеприведенный код, чтобы действовать на интерфейс, IFly, этот код можно применить ко всему, что обеспечивает реализацию этого интерфейса.

Ответ 2

Вот несколько хороших ссылок.

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 и иметь интерфейсы, абстрагирующие от этого класса, более разумные, чем отдельные классы для каждого типа.

Базовая логика может поддерживаться одинаковой в базовом классе, а интерфейсы могут изменять детали при необходимости.

Ответ 3

Интерфейсы в основном необходимы, если у вас есть компоненты, зависящие друг от друга. Общим примером является контроллер протоколирования и некоторые классы журналов.

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, и он полностью не знает, что на самом деле делает журнал, чтобы фактически записывать материал.

Другим преимуществом программирования для интерфейсов является то, что он позволяет упростить модульное тестирование. Контроллер может быть легко протестирован с помощью инжекции ложного регистратора, который также будет реализовывать интерфейс.