#c# #.net
Вопрос:
Я младший разработчик, который последние несколько месяцев работал с C#. Я снова изучил некоторые основные принципы, прочитав документацию Microsoft, и наткнулся на предложение, в котором есть некоторые формулировки, которые я нахожу запутанными. В документации говорится:
MyClass mc = new MyClass();
MyClass mc2 = mc;
Интерфейс должен быть инициализирован вместе с объектом класса, который его реализует. Если MyClass реализует IMyInterface, вы создаете экземпляр IMyInterface, как показано в следующем примере:
IMyInterface iface = new MyClass();
Слова «интерфейс должен быть инициализирован» и «вы создаете экземпляр IMyInterface» не имеют для меня особого смысла, и это еще не то, что мне приходилось делать.
Насколько я понимаю, MyClass будет реализовывать IMyInterface, а затем, например, может быть передан в какой-либо метод, который ожидает параметр IMyInterface. Поскольку MyClass должен был бы реализовать все необходимые методы интерфейса, он выполнял бы свою часть «контракта», и метод, который ожидает, что параметр IMyInterface сможет взаимодействовать с ним по своему усмотрению (рассматривая его как IMyInterface на уровне «поверхности», даже если это экземпляр MyClass).
Где происходит инициализация интерфейса? Я неправильно понимаю это предложение и, возможно, вместо этого в документации говорится, что
IMyInterface iface = new MyClass();
является ли то, что происходит неявно при инициализации объекта класса, реализующего этот интерфейс?
Я совершенно не понимаю, почему здесь говорится об инициализации интерфейса, когда, на мой взгляд, это противоречит сути интерфейса.
Комментарии:
1. Предположительно, это документация ? Вам действительно было бы более полезно включить такую ссылку (если она правильная или другая) в свой вопрос , чтобы другие могли видеть больше окружающего контекста, чем просто слова, которые вы выбрали.
2. Это утверждение само по себе кажется излишне запутанным. Все, что делает эта строка кода, — это создает экземпляр
MyClass
и сохраняет ссылку на этот экземпляр в переменной типаIMyInterface
.3. @Damien_The_Unbeliever Вы правы, я добавил ссылку на документацию. Однако, честно говоря, в документации действительно не так много контекста для этого утверждения. Кажется, он просто заявляет об этом и движется дальше, что для меня имеет еще меньше смысла
4. Я подозреваю, что он очень сильно пытается заявить, что вы не можете напрямую »
new
настроить» интерфейс.5. Ну, я поднял этот пиар для документа, потому что, что бы он ни пытался сказать, это не ясно.
Ответ №1:
Я думаю, что я доволен пониманием того, что все, что они говорят, это то, что нельзя инициализировать интерфейс таким образом:
IMyInterface iface = new IMyInterface();
и вместо этого он всегда должен быть инициализирован с помощью класса, реализующего интерфейс:
IMyInterface iface = new ClassThatImplementsThisInterface();
Я думаю, что, возможно, я прочитал в этом слишком много.
Ответ №2:
Создание экземпляра интерфейса означает создание класса, производного от интерфейса. Насколько я понимаю, эту строку IMyInterface iface = new MyClass();
можно рассматривать как экземпляр экземпляра MyClass
интерфейса и как экземпляр экземпляра интерфейса IMyInterface
. Конечно MyClass
, необходимо реализовать IMyInterface
, чтобы это было действительным.
Комментарии:
1. «MyClass должен наследовать от IMyInterface, чтобы это было действительным». «Наследовать от» и «реализовать» — это две разные вещи.
2. Спасибо вам за ответ. Я понимаю, что это то, что он делает, но я думаю, что, возможно, я просто обманываю себя, анализируя формулировку. Возможно, в документации говорится, что если вы хотите инициализировать интерфейс, это должно быть сделано с использованием экземпляра класса, реализующего интерфейс, что, я полагаю, само собой разумеется. Может быть, я просто слишком придираюсь к мелочам
3. Нет ничего плохого в том, чтобы быть придирчивым, когда пытаешься выучить язык программирования. Для новичка концепции являются новыми, и, конечно, это облегчает обучение, если в документации используется последовательный и понятный словарь. Изучение языков программирования также немного похоже на попытку выучить настоящий язык; вначале это неизбежно приведет к недоразумениям.
4. @Дастон, конечно, ты прав. Я перешел на «реализовать».