#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); Таким образом вы сможете пинать хоть коробку, хоть слона, хоть птицу Говорун, отличающуюся умом и сообразительностью. При этом все эти сущности между собой никак не связаны, а пинающая система понятия не имеет кого она там пнула.
Комментариев нет:
Отправить комментарий