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