Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

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

На данный вопрос уже ответили: Отличия абстрактного класса от интерфейса (abstract class and interface) 12 ответов Изучаю 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 } }
Если смотреть от обратного, то я не просто создаю методы в каждом классе, но еще и объявляю непонятный интерфейс и наследую от него свои классы, что только увеличило мой код... Код аккуратно вставить не получилось... Прошу помочь разобраться.


Ответ

Воспринимайте интерфейс, как контракт на реализацию определённых методов в несвязанных классах.
Грубо говоря, наследуя класс от интерфейса вы обязуетесь реализовать в этом классе определённые методы, при этом сами классы могут иметь совершенно различную "родословную".
В итоге, в любом методе, где вы получите экземпляр класса реализующего интерфейс, вы сможете вызвать нужный вам метод не заботясь о том, что за класс вам прислали.
Например, у вас есть система, которая отвечает за то, чтобы давать пинка каждому, кто проходит мимо. Чтобы не реализовывать в этой системе кучу ифов с проверкой на классы, чтобы понять каким образом пинок должен влиять на этот объект (лёгкий - подбрасывать, тяжёлый - толкать и т.д.) - вы создаёте интерфейс IPushable, который говорит, что реализующий его класс имеет метод PushIt(float velocity). А всю логику по применению ускорения от пинка передаёте в сами классы, которые реализуют этот интерфейс.
Сама же система получает вошедший объект через какой-нибудь метод вроде public void ObjectIn(object obj). В этом методе делает проверку if (obj is IPushable) и если она истина - то со всей своею первобытной яростью даёт объекту пинка, через приведение типов
var pushable = obj as IPushable; pushable.PushIt(velocity);
Таким образом вы сможете пинать хоть коробку, хоть слона, хоть птицу Говорун, отличающуюся умом и сообразительностью. При этом все эти сущности между собой никак не связаны, а пинающая система понятия не имеет кого она там пнула.

Комментариев нет:

Отправить комментарий