c #, интерфейс, назначение - PullRequest
2 голосов
/ 26 мая 2011

У меня есть вопрос. Интерфейс не содержит никакого определения. Интерфейс не может быть создан. Как этот код может быть действительным?

IDataReader reader = cmd.ExecuteReader()

cmdExecuteReader возвращает объект со значением в памяти. читатель интерфейс. Как объект может быть назначен интерфейсу? Разве интерфейс - это просто контракт без определения метода внутри?

Ответы [ 3 ]

10 голосов
/ 26 мая 2011

ExecuteReader не возвращает объект - он возвращает ссылку на объект некоторого типа, который реализует IDataReader (или ноль, конечно).

Идея состоит в том, что вызывающий / клиент не должен знать о реализации класса, просто он реализует интерфейс. Когда клиент вызывает метод, такой как reader.Next(), он будет использовать реализацию, основанную на типе времени выполнения объекта, к которому относится значение reader.

Присвоение ссылочного значения переменной не меняет тип объекта, на который ссылается эта ссылка. Например:

string text = "hello";
object o = text;

Теперь o и text имеют одно и то же значение - ссылку на одну и ту же строку. Если вы звоните:

Type t = o.GetType();

, который по-прежнему будет возвращать ссылку на объект Type, представляющий System.String, поскольку значение o относится к объекту String; тип переменной, через которую вы получаете доступ к объекту, не меняет тип времени выполнения объекта.

1 голос
/ 26 мая 2011

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

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

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

...