интерфейс: упрощенный - PullRequest
       1

интерфейс: упрощенный

5 голосов
/ 21 марта 2012

Я проводил некоторые исследования интерфейсов и объяснил простому дилетанту, что это такое на самом деле. при поиске в море книг. По какой-то причине люди любят использовать слишком сложные объяснения и жаргон для объяснения действительно простых понятий (думаю, это заставляет их чувствовать себя большими), и у меня есть ощущение, что в этом случае то же самое.

Итак, из того, что я мог понять, кажется, что интерфейсы - это не что иное, как способ зарезервировать имена методов, их возвращаемый тип, если таковые имеются, а также тип и количество аргументов, которые они принимают. поэтому, когда класс реализует интерфейс (или интерфейсы), он вынужден определять тело каждого метода из интерфейса (ов). Я на носу с этим или мне нужно продолжать копать?

p.s. я знаю, что у javascript нет поддержки интерфейсов, но мне все еще нужно понять концепцию, потому что есть довольно много мест, где показано, как имитировать до некоторой степени.

Ответы [ 9 ]

10 голосов
/ 21 марта 2012

Почему-то люди любят использовать слишком сложные объяснения и жаргон для объяснения действительно простых понятий (думаю, это заставляет их чувствовать себя большими)

Подумайте об отказе от редакционных комментариев, которые приписывают плохие мотивы людям, которые пытаются вам помочь. Это действительно плохой способ заставить людей помочь вам.

Кажется, что интерфейсы - это не что иное, как способ зарезервировать имена методов, их возвращаемый тип, если он есть, а также тип и количество аргументов, которые им требуются. Поэтому, когда класс реализует интерфейс (или интерфейсы), он вынужден определять тело каждого метода из интерфейса (ов). Я на носу с этим или мне нужно продолжать копать?

Вы на правильном пути, но вы ошибаетесь в деталях. Например, в C # реализующий класс не требуется для предоставления тела. Метод, который соответствует методу интерфейса, может, например, быть абстрактным методом в абстрактном классе, который тогда не имел бы тела. А в C # интерфейсу могут потребоваться члены, отличные от методов; свойства, события и индексаторы, например.

Более краткий и типичный способ выразить идею, что интерфейсы навязывают требование , чтобы тип поставлял членов , которые соответствуют определенным сигнатурам означает, что интерфейс представляет собой контракт , который должен быть выполнен его исполнителем . Но это может быть слишком сложно и жаргонно для вашего желудка.

9 голосов
/ 21 марта 2012

Я объясняю концепцию мирян, используя аналогию, понятную большинству людей, - пластиковое литье.

Интерфейс определяет форму объекта точно так же, как форма будет обеспечивать форму готового изделия..

Вы можете залить форму белым пластиком, синим пластиком, чем-то экзотическим, например, эпоксидной смолой или глиной.

Важно то, что независимо от того, из чего они сделаны, у них всех естьта же самая единообразная форма для покупателя продукта.

Для кода это означает, что независимо от того, какой код используется для реализации интерфейса, все они следуют одному и тому же согласованному контракту / форме для конечного пользователя.

Надеюсь, это немного поможет.

Редактировать -

Чтобы расширить аналогию с абстрактными классами, представьте себе следующий шаг в процессе формования.Вы запускаете производство белого, синего и красного пластика, но затем каждый предмет должен быть окрашен на отдельном заводе, мы просто отправляем его.

Элемент не закончен, но он имеет свою формуопределены.Позже придет кто-то и заполнит детали, которые наша фабрика оставила пустыми.

Эти предметы нельзя продать, пока они не получат последний шаг рисования.

В коде абстрактная реализация интерфейса обеспечиваетнекоторые (или никакие) реализации, но оставляют другой класс-потомок для завершения контракта, и таким же образом никто не может создать экземпляр класса, пока контракт не будет завершен.

Таким же образомтем не менее, вы все равно можете ссылаться на абстрактный класс в коде, точно так же, как вы можете ссылаться на неокрашенный элемент пресс-формы как на «белый отлитый в форму предмет», увядающий или не окрашенный!*

Вот краткий пример

void Main()
{
    //IMold mold = new IMold(); // error - can't create instance of an interface
    //Fruit fruit = new Fruit(); // error - can't create instance of an abstract class

    Apple apple1 = new Apple(); // good
    Orange orange1 = new Orange(); // good

    Fruit apple2 = (Fruit)apple1; // good - Apples are fruit
    Fruit orange2 = (Fruit)orange1; // good - oranges are fruit

    IFruitMold apple3 = (IFruitMold)apple2; // good - Apples fit the Mold
    IFruitMold orange3 = (IFruitMold)orange2; // good - Oranges also fit the mold


    //now I can do this:
    //Notice that `fruits` is of type IList<T> but the new is List<T>
    //This is the exact concept we are talking about
    //IList<T> is some kind of set of items that can be added or subtracted from
    //but we don't have to care about the implementation details of *HOW* this is done
    IList<IFruitMold> fruits = new List<IFruitMold>();
    fruits.add(apple3);
    fruits.add(orange3);

    foreach( var fruit in fruits )
    {
        fruit.PlasticColor.Dump(); // ok I can read
        fruit.PlasticColor = ""; // error - no Set defined in the interface

        // depending on the **implementation details** of what type of fruit this is true or false
        // we don't care in the slightest, we just care that we have some IFruitMold instances
        fruit.RequiresPainting.Dump(); 
    }
}

interface IFruitMold
{
    string PlasticColor { get; }
    bool RequiresPainting { get; }
}

abstract class Fruit : IFruitMold
{
    private string m_PlasticColor = string.Empty;
    public string PlasticColor { get; private set; }
    public abstract bool RequiresPainting { get; }
}

//notice that we only define the abstract portion of the base class
//it defined PlasticColor for us already!
//the keyword `override` is required  - it is to make it clear that 
//this member is overriding a member from it's parent.
class Apple : Fruit
{
    public override bool RequiresPainting { get { return true; } }
}

class Orange : Fruit
{
    public override bool RequiresPainting { get { return false; } }
}
2 голосов
/ 21 марта 2012

Я бы сказал, что больше, чем резервирование имени метода, это способ заключить договор о том, что метод будет существовать, и вызывающей стороне не нужно будет знать, что он делает, но он все равно будет доступен для вызова

Хорошим примером может служить перо и карандаш, которые могут реализовать интерфейс Iwriter с помощью метода записи, но тот, кто вызывает метод записи, не должен знать, что кто-то использует чернила, а кто-то использует свинец, вызывающий абонент просто знает, что собираюсь писать слова на бумаге.

2 голосов
/ 21 марта 2012

когда класс реализует интерфейс (или интерфейсы), он вынужден определять тело каждого метода из интерфейса (ов).

Да.Интерфейсы контрактные.Они сообщают другим, что ваш класс реализует определенные функции.

2 голосов
/ 21 марта 2012

Интерфейс - это простой пустой класс, который показывает контракт о том, как должен выглядеть ваш настоящий класс. Я думаю, что у вас есть концепция хорошо.

Они ничего не резервируют (я не понимаю, что вы имеете в виду под этим), это просто способ, так что когда вы строите свой класс вокруг интерфейса, у вас есть предварительное знание того, как будет выглядеть ваш класс. А также вы можете узнать, какие методы будут у него.

2 голосов
/ 21 марта 2012

Да, в двух словах, есть интерфейсы, чтобы объявлять и обещать всем остальным, что у класса будут определенные методы.

Это хорошо, когда вы создаете обобщенные методы и функции, где вам нужен более абстрактный дизайн. Все, что вы хотите знать, - это то, что ваша функция может получить объект, имеющий методы A B и C.

1 голос
/ 21 марта 2012

Интерфейс используется для обеспечения общей функциональности среди набора совершенно не связанных между собой объектов.

Допустим, у нас есть группа животных, и нам нужно отделить домашних животных от этой группы.Задача разделения становится действительно простой, если мы реализуем контракт таким образом, чтобы все животные, являющиеся домашними животными, должны были реализовать интерфейс IPet.

1 голос
/ 21 марта 2012

По сути, интерфейс - это контракт, который может определять свойства (методы получения и установки) или методы (с любыми необходимыми параметрами).Если объект «реализует» интерфейс, ему нужно определить конкретную реализацию для ВСЕХ свойств и методов, определенных в интерфейсе.

Для модульного тестирования или инверсии интерфейсов Контейнеров управления действительно вступают в свои собственные, как вы можете вызватьметоды / свойства интерфейса, ничего не зная об объекте, который его реализует.

1 голос
/ 21 марта 2012

Интерфейсы обеспечивают единый способ взаимодействия с множеством объектов.

Независимо от того, что это за объект, если он реализует интерфейс, мы знаем, что он будет реагировать на метод, определенный в интерфейсе. Таким образом, мы можем создавать объекты, которые представляют разные вещи в проекте, и при этом взаимодействовать с ними одинаково. Реальная реализация методов, определенных в интерфейсе, может быть совершенно другой, но они будут принимать одни и те же входные данные и обеспечивать один и тот же тип выходных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...