каковы интерфейсы и различия в отношении наследования - PullRequest
1 голос
/ 20 июля 2010

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

Ответы [ 6 ]

4 голосов
/ 20 июля 2010

Объекты определяют свое взаимодействие с внешним миром через методы, которые они выставляют. Методы формируют интерфейс объекта с внешним миром; Например, кнопки на передней панели телевизора являются интерфейсом между вами и электропроводкой на другой стороне его пластикового корпуса. Вы нажимаете кнопку «питания», чтобы включить и выключить телевизор. В своей наиболее распространенной форме интерфейс представляет собой группу связанных методов с пустыми телами.

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

interface IBicycle {

       void changeCadence(int newValue);   // wheel revolutions per minute

       void changeGear(int newValue);

       void speedUp(int increment);

       void applyBrakes(int decrement);
}

Для реализации этого интерфейса имя вашего класса изменится (например, на велосипед определенной марки, например, ACMEBicycle), и вы будете использовать ключевое слово Implements в объявлении класса:

class ACMEBicycle : IBicycle {

   // remainder of this class implemented as before

}

Реализация интерфейса позволяет классу стать более формальным в отношении поведения, которое он обещает предоставить. Интерфейсы формируют контракт между классом и внешним миром, и этот контракт применяется компилятором во время сборки. Если ваш класс утверждает, что реализует интерфейс, все методы, определенные этим интерфейсом, должны появиться в его исходном коде, прежде чем класс будет успешно скомпилирован.

Вы можете найти более подробную информацию, также проверяя разницу между Interface и Class.

1 голос
/ 20 июля 2010

Интерфейсы лучше всего использовать в местах, где:

  • Несколько классов совместно используют функциональность на концептуальном уровне, но фактически не разделяют код.
  • Там, где существует жесткое разделение между провайдерамии пользователь класса, когда поставщик не желает делиться какими-либо подробностями самого класса.(Это не обязательно означает секретность - в WCF пользователь и поставщик класса могут быть разделены Интернетом; пользователю потребуется интерфейс для доступа к удаленному объекту)
1 голос
/ 20 июля 2010

Единственные различия между интерфейсами и классами:

  • Интерфейсы не могут иметь реализацию
  • Классы могут наследоваться только по одному
0 голосов
/ 20 июля 2010

У Icognito есть хороший ответ (за который я проголосовал). Я только хотел добавить следующее:

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

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

Отдаленный пример Икогнито был на самом деле лучше, чем велосипед. Телевизор может иметь интерфейс типа:

interface ITelevision {
  void TogglePower();
  void ChangeChannel( Int32 channel);
}

Пару объектов, которые могут иметь дело с этим интерфейсом, будут один или несколько телевизионных объектов и объект Remote, например:

class SonyTelevision: ITelevision {
  public void TogglePower {
    //Perform the operation to turn the TV on or off
  }
  public void ChangeChannel (Int32 channel) {
    // Perform the operation of changing the channel
  }
}

class ToshibaTelevision: ITelevision {
  public void TogglePower {
    //Perform the operation to turn the TV on or off
  }
  public void ChangeChannel (Int32 channel) {
    // Perform the operation of changing the channel
  }
}

class Remote {
  private _television : Object; // here we don't care what kind of TV it is.

  public void ToggleTvPower {
    ITelevision tv = _television as ITelevision;
    tv.TogglePower();
  }
}

В приведенном выше описании производители телевизоров Sony и Toshiba могут иметь собственную иерархию классов для телевизоров. Тем не менее, они оба реализуют общий интерфейс ITelevision, который значительно облегчает кодирование для этих классов.

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

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

0 голосов
/ 20 июля 2010

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

Например, модель плагина (add-on) обычно использует интерфейсы для определения плагина. Будет встроенная библиотека взаимодействия (DLL), которая определяет интерфейсы, которые могут / должны / должны быть реализованы любыми подключаемыми модулями, используемыми приложением.

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

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

В сценарии с плагином приложение обычно имеет назначенную папку, в которой находятся плагины. Во время выполнения он сканирует папку на наличие сборок, сканирует каждую сборку на наличие классов / структур, проверяет каждый класс / структуру на наличие известных (interop) интерфейсов и динамически загружает любые соответствующие подключаемые модули, которые он находит по интерфейсу . В зависимости от механизма каждый плагин обычно добавляется в какое-то меню, чтобы его мог использовать конечный пользователь.

В этой модели плагины могут обновляться без перекомпиляции приложения, а приложение может обновляться без перекомпиляции плагинов. Пока версия / подпись библиотеки взаимодействия не меняется , само приложение или отдельные подключаемые модули можно обновлять / модифицировать / исправлять независимо, без необходимости распространять весь комплект-n-kaboodle.

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

0 голосов
/ 20 июля 2010

Преимущество использования интерфейсов состоит в том, что вы можете использовать макетированные объекты во время ваших юнит-тестов.
Например. Когда для метода требуется экземпляр DbConnection, вы должны предоставить его - что может быть очень сложно в рамках небольшого теста. Но когда для этого требуется IDbConnection, вы можете предоставить макет .
На SO есть тег " mocking ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...