#c_sharp #интерфейс
На этот вопрос уже даны ответы здесь: Отличия абстрактного класса от интерфейса (abstract class and interface) (12 ответов) Закрыт 2 года назад. Изучаю 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 } } Если смотреть от обратного, то я не просто создаю методы в каждом классе, но еще и объявляю непонятный интерфейс и наследую от него свои классы, что только увеличило мой код... Код аккуратно вставить не получилось... Прошу помочь разобраться.
Ответы
Ответ 1
Воспринимайте интерфейс, как контракт на реализацию определённых методов в несвязанных классах. Грубо говоря, наследуя класс от интерфейса вы обязуетесь реализовать в этом классе определённые методы, при этом сами классы могут иметь совершенно различную "родословную". В итоге, в любом методе, где вы получите экземпляр класса реализующего интерфейс, вы сможете вызвать нужный вам метод не заботясь о том, что за класс вам прислали. Например, у вас есть система, которая отвечает за то, чтобы давать пинка каждому, кто проходит мимо. Чтобы не реализовывать в этой системе кучу ифов с проверкой на классы, чтобы понять каким образом пинок должен влиять на этот объект (лёгкий - подбрасывать, тяжёлый - толкать и т.д.) - вы создаёте интерфейс IPushable, который говорит, что реализующий его класс имеет метод PushIt(float velocity). А всю логику по применению ускорения от пинка передаёте в сами классы, которые реализуют этот интерфейс. Сама же система получает вошедший объект через какой-нибудь метод вроде public void ObjectIn(object obj). В этом методе делает проверку if (obj is IPushable) и если она истина - то со всей своею первобытной яростью даёт объекту пинка, через приведение типов var pushable = obj as IPushable; pushable.PushIt(velocity); Таким образом вы сможете пинать хоть коробку, хоть слона, хоть птицу Говорун, отличающуюся умом и сообразительностью. При этом все эти сущности между собой никак не связаны, а пинающая система понятия не имеет кого она там пнула.
Комментариев нет:
Отправить комментарий