Что такое Interface в C#? [дубликат]

243
01 июня 2018, 23:40

На данный вопрос уже ответили:

  • Отличия абстрактного класса от интерфейса (abstract class and interface) 11 ответов

Изучаю C#. Никак не могу понять смысл интерфейсов. Примеры, которые приводятся на тех или иных ресурсах не дают мне полного понимания смысла интерфейсов. Что я понял:

  • В интерфейсах объявляются методы и свойства(как и в обычном классе)
  • Если класс наследуется от интерфейса, он обязан реализовать все методы интерфейса
  • Интерфейсы желательно начинать с буквы I - IComparable (желательно, но не обязательно)

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

public interface IPizza
{
    public void Order();
}
public class PepperoniPizza : IPizza
{
    public void Order()
    {
        //Order Pepperoni pizza
    }
}
public class HawaiiPizza : IPizza
{
    public void Order()
    {
        //Order HawaiiPizza
    }
}

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

Answer 1

Воспринимайте интерфейс, как контракт на реализацию определённых методов в несвязанных классах.

Грубо говоря, наследуя класс от интерфейса вы обязуетесь реализовать в этом классе определённые методы, при этом сами классы могут иметь совершенно различную "родословную".

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

Например, у вас есть система, которая отвечает за то, чтобы давать пинка каждому, кто проходит мимо. Чтобы не реализовывать в этой системе кучу ифов с проверкой на классы, чтобы понять каким образом пинок должен влиять на этот объект (лёгкий - подбрасывать, тяжёлый - толкать и т.д.) - вы создаёте интерфейс IPushable, который говорит, что реализующий его класс имеет метод PushIt(float velocity). А всю логику по применению ускорения от пинка передаёте в сами классы, которые реализуют этот интерфейс.

Сама же система получает вошедший объект через какой-нибудь метод вроде public void ObjectIn(object obj). В этом методе делает проверку if (obj is IPushable) и если она истина - то со всей своею первобытной яростью даёт объекту пинка, через приведение типов

var pushable = obj as IPushable;
pushable.PushIt(velocity);

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

READ ALSO
Почему QualitySettings ругается на names? И на GetQualityLevel?

Почему QualitySettings ругается на names? И на GetQualityLevel?

Почему QualitySettings ругается на names? И на GetQualityLevel?

222
Как переслать массив чисел на сервер?

Как переслать массив чисел на сервер?

Я знаю, что можно переслать текст с помощью byte[] msg = EncodingUTF8

273
Масштабирование элементов Panel в Windows Forms

Масштабирование элементов Panel в Windows Forms

У меня есть форма, панель на ней, и в панеле элементыЯ хочу при изменении размера формы масштабировать размеры элементов панели так, чтобы...

282
Репорт из Базы данных

Репорт из Базы данных

Пытаюсь сделать репорт из бд, но появляется ошибкаМожет кто знает как решить проблему?

299