Использование переменных интерфейса - PullRequest
37 голосов
/ 28 января 2010

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

Что я не понимаю, так это когда вы создаете переменную одного из типов вашего интерфейса:

IMyInterface somevariable;

Зачем ты это делаешь? Я не понимаю, как IMyInterface может использоваться как класс ... например, для вызова методов, поэтому:

somevariable.CallSomeMethod();

Зачем вам использовать переменную IMyInterface для этого?

Ответы [ 12 ]

0 голосов
/ 28 января 2010

Скажем, например, у вас есть два класса: Book и Newspaper. Вы можете прочитать каждый из них, но для них двоих не имеет смысла наследовать от общего суперкласса. Таким образом, они оба будут реализовывать интерфейс IReadable:

public interface IReadable
{
    public void Read();
}

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

Метод в вашем приложении, который читает пользователю, примет это Book или Newspaper в качестве параметра. Это может выглядеть так в коде:

public static void ReadItem(IReadable item)
{
    item.Read();
}

Поскольку параметром является IReadable, мы знаем, что у объекта есть метод Read(), поэтому мы вызываем его, чтобы прочитать его пользователю. Не имеет значения, является ли это Book, Newspaper или чем-то еще, что реализует IReadable. Отдельные классы реализуют в точности то, как каждый элемент будет читаться с помощью метода Read(), поскольку он, скорее всего, будет отличаться для разных классов.

Book Read() может выглядеть так:

public void Read()
{
    this.Open();
    this.TurnToPage(1);
    while(!this.AtLastPage)
    {
        ReadText(this.CurrentPage.Text);
        this.TurnPage();
    }
    this.Close();
}

Newspaper s Read() скорее всего будет немного другим:

public void Read()
{
    while(!this.OnBackPage)
    {
        foreach(Article article in this.CurrentPage.Articles)
        {
            ReadText(article.Text);
        }
    }
}

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

0 голосов
/ 28 января 2010

Цель интерфейса - определить контракт между несколькими объектами, независимо от конкретной реализации.

Таким образом, вы обычно используете его, когда у вас есть Intrace ISomething и конкретная реализация

class Something : ISomething

Таким образом, интерфейс Varialbe будет использоваться при создании экземпляра контракта:

ISomething myObj = new Something();
myObj.SomeFunc();

Вы также должны прочитать интерфейс C #

Обновление:

Я объясню логику использования интерфейса для переменной, а не самого класса на примере (реальной жизни):

У меня есть общее взаимодействие с репозиторием:

Interface IRepository {
    void Create();
    void Update();
}

И у меня есть 2 отдельные реализации:

class RepositoryFile : interface IRepository {}
class RepositoryDB : interface IRepository {}

Каждый класс имеет совершенно другую внутреннюю реализацию.

Теперь у меня есть еще один объект, Logger, который использует уже созданный экземпляр репозитория для своей записи. Этому объекту все равно, как реализован репозиторий, поэтому он просто реализует:

void WriteLog(string Log, IRepository oRep);

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

Более подробное обсуждение различий между абстрактными классами и интерфейсами см. здесь .

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