В чем разница между IFoo foo = new Foo () и Foo foo = new Foo () - PullRequest
1 голос
/ 01 ноября 2009
public class Foo : IFoo
...

В чем разница между

IFoo foo = new Foo();

и

Foo foo = new Foo();

Ответы [ 3 ]

10 голосов
/ 01 ноября 2009

Разница только в объявленном типе переменной. Этот тип будет использоваться компилятором всякий раз, когда вы используете выражение foo. Например, предположим, что класс Foo содержит некоторый метод, который не в IFoo. С первым объявлением этот член не будет виден - вам нужно будет привести foo к Foo, чтобы вызвать его. Во втором объявлении у вас будет прямой доступ к нему.

Обратное верно для членов IFoo, которые реализованы с помощью явной реализации интерфейса в Foo. Это относительно редко, но это случается.

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

foo = new SomeOtherIFooImplementation();

, тогда как со вторым объявлением вы можете назначать только значения, которые совместимы с Foo, то есть экземплярами Foo или производным классом. (В обоих случаях, конечно, вы можете установить переменную в null.)

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

Тип переменной также влияет на такие вещи, как разрешение перегрузки:

DoSomething(foo);

может вызывать разные методы в зависимости от того, объявлено ли foo как Foo или IFoo.

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

1 голос
/ 01 ноября 2009

Если foo имеет тип IFoo и в Foo реализованы методы или свойства, которые не определены в IFoo, вы не сможете получить к ним доступ, если вы не приведете foo к Foo.

Если foo имеет тип IFoo, вы можете создавать экземпляры других типов, которые также наследуются от IFoo, и назначать его для foo. Это более абстрактно, так что вы не зависите конкретно от типа Foo.

0 голосов
/ 01 ноября 2009

Первый пример - это экземпляр некоторого объекта, реализующего IFoo. Второй пример - это экземпляр объекта Foo.

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