Страницы

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

пятница, 31 января 2020 г.

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

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

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

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