Почему мы должны реализовать интерфейс? - PullRequest
4 голосов
/ 23 мая 2011

Реализация интерфейса просто обеспечивает основу метода.Если мы знаем точную строку подписи этого метода, в этом случаеКакое требование для реализации интерфейса?В этом случае интерфейс был реализован

interface IMy
{
    void X();
}
public class My:IMy
{
    public void X()
    {
        Console.WriteLine("Interface is implemented");
    }
}

В этом случае интерфейс не был реализован

public class My
{
    public void X()
    {
        Console.WriteLine("No Interface is implemented ");
    }
}

My obj = new My();
obj.X();

Оба подхода дадут одинаковый результат.Какое требование для реализации интерфейса?

Ответы [ 7 ]

6 голосов
/ 23 мая 2011

Назначение интерфейсов - позволить вам использовать два разных класса , как если бы они были одного типа . Это неоценимо, когда речь идет о разделении интересов.

например. Я могу написать метод, который читает данные из IDataReader. Моему методу не нужно знать (или заботиться), является ли это SqlDataReader и OdbcDataReader или OracleDataReader.

private void ReadData(IDataReader reader)
{
....
}

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

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

5 голосов
/ 23 мая 2011

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

Это также может быть полезно дляList<ISomeInterface> содержит различные реализации.

3 голосов
/ 23 мая 2011

В .net есть две цели наследования:

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

В отличие от некоторых языков (например, C ++), которые допускают множественное наследование, .net требует, чтобы у каждого класса был точно один родительский тип (Object, если не что-либо еще).С другой стороны, иногда полезно иметь класс, заменяющий ряд не связанных типов.Вот тут и вступают интерфейсы.

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

2 голосов
/ 23 мая 2011

Вот простой пример, который помог мне понять интерфейсы:

interface IVehicle
{
    void Go();
}
public class Car:IVehicle
{
    public void Go()
    {
        Console.WriteLine("Drive");
    }
}

public class SuperCar:IVehicle
{
    public void Go()
    {
        Console.WriteLine("Drive fast!!");
    }
}

IVehicle car = new Car();
car.Go(); //output Drive
car = new SuperCar();
car.Go(); //output Drive fast!!
1 голос
/ 23 мая 2011

Вы привели очень простой пример, поэтому, вероятно, вам трудно понять, почему. Изучите что-то вроде этого:

public interface IDbColumn
    {
        int domainID { get; set; }

    }

    public static IEnumerable<T> GetDataByDomain<T>(
        IQueryable<T> src) where T:IDbColumn
    {
        string url = HttpContext.Current.Request.Url.Host;
        int i = url == "localhost" ? 1 : 2;

        return src.Where(x => x.domainID == i|| x.domainID == 3);
    }

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

0 голосов
/ 23 мая 2011

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

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

interface DatabaseDriver
{
     public function connect(ConnectionDetails $details){}
     public function disconnect(){}
     public function query(Query $query){}
     public function prepareQuery(SQLQuery $query){}
}

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

class MySqlDriver extends Database implements DatabaseDriver{}
class AccessDriver extends Database implements DatabaseDriver{}
class MsSqlDriver extends Database implements DatabaseDriver{}

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

Примечание: код в PHP

0 голосов
/ 23 мая 2011

Скажем, у вас есть три класса, A, B, C.

A должен принять аргументЧерез B или C можно пройти.

Лучший способ сделать это - создать интерфейс, который B и C разделяют

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