в чем разница между оболочкой IShell = new ... и оболочкой Shell = new - PullRequest
1 голос
/ 18 марта 2009

Я работаю с Руководством по составным приложениям и часто сталкиваюсь с созданием объекта типа интерфейса, например ::100100

IShell shell = new Shell();

вместо класса типа:

Shell shell = new Shell();
  • В чем различия между этими двумя?
  • Почему вообще используется первый способ (поскольку второй объект оболочки может использоваться везде, где указан интерфейс IShell, верно?)

Ответы [ 3 ]

2 голосов
/ 18 марта 2009

Возможно, вы захотите сделать это, если у класса есть явная реализация метода интерфейса. Рассмотрим этот пример:

public interface ISomething { void Action(); }
public interface ISomethingElse {void Action(); }
public class Something : ISomething
{
    public void Action()
    {
    }
    void ISomething.Action()
    {
    }
}
public class Something2 : ISomething, ISomethingElse
{
    void ISomething.Action()
    {
    }
    void ISomethingElse.Action()
    {
    }
}

Если вы хотите, чтобы ISomething.Action вызывался для Something, вы должны вызывать его через переменную ISomething. Даже в Something2 метод Action скрыт, если вы не делаете это через интерфейс.

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

Обновление 1: Чтобы прояснить ситуацию, приведем дополнительный код о том, как добраться до методов:

Something some = new Something();
some.Action(); //calls the regular Action
ISomething isome = some;
isome.Action(); //calls the ISomething.Action
((ISomething)some).Action(); //again, calls ISomething.Action

Something2 some2 = new Something2();
some2.Action();//compile error
((ISomething)some2).Action(); //calls ISomething.Action
((IsomethingElse)some2).Action(); // calls ISomethingElse.Action
1 голос
/ 18 марта 2009

В первом примере вы можете использовать только функциональность, указанную в IShell в вашем исходном коде, во втором примере вы также можете использовать дополнительные функции объекта Shell, который не определен в интерфейсе.

Первое решение предлагает большую гибкость, если вам нужно заменить объект Shell другим объектом ShellEx, который имеет те же функциональные возможности, но другую реализацию. Для этого вам нужно всего лишь изменить

IShell shell = new Shell();

до

IShell shell = new ShellEx();

Остальная часть вашего кода не нуждается в изменении.

Второе решение позволяет использовать все функциональные возможности объекта Shell.

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

1 голос
/ 18 марта 2009

Очевидное отличие состоит в том, что первый позволяет использовать оболочку только в качестве IShell, а второй позволяет использовать все функции Shell, в том числе и IShell.

Возможно, вы могли бы отвести взгляд от сопровождающего.

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

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

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