Похоже, я создаю экземпляр этого интерфейса SpeechAPI. Как это возможно?

Я использую функцию Microsoft Text-to-Text Speech в своем проекте. Но у меня есть вопрос об этом, на самом деле не напрямую об этом. Так:

Обычно программисты, создавая Interface, ставят I в качестве префикса имени интерфейса, такого как IReadable, IEnumerator и т. Д. Но я столкнулся с тем, что действительно шокировало меня.

в Microsoft Text Speech DLL есть что-то вроде этого: SpVoice, который является интерфейсом (они почему-то не указали I в качестве префикса, и я не знаю почему?) и SpVoiceClass. Итак, в чем проблема, вы можете спросить, здесь:

SpVoice speak= new SpVoice(); //I created an object from SpVoice Interface
speak.Speak("Hello StackOverFlow"); //and it speaks and say exactly what I write.

а также

SpVoiceClass speak =  new SpVoiceClass();
speak.Speak("Hello Kowanichi"); //and it does the same thing.

Что я не понимаю, это как? Как работает первый, хотя он говорит, что это интерфейс с множеством нереализованных методов и т. Д.

Пожалуйста, объясните мне, КАК?

Сейчас я в замешательстве, и, возможно, разработчики Microsoft по этой причине не поставили мой префикс, его можно создать.

Заранее спасибо. Надеюсь, я четко опишу свою проблему.

Вот изображение, которое я хочу, чтобы вы увидели: http://www.pixelshack.us/images/dngpe9kzoq83obtiami.png

3 ответа

Решение

РЕДАКТИРОВАТЬ: Ах, я вижу. Посмотрите на определение SpVoice:

[CoClass(typeof(SpVoiceClass))]
public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event
{}

Затем найдите атрибут CoClass:

Coclass предоставляет конкретные реализации одного или нескольких интерфейсов. В COM такие конкретные реализации могут быть написаны на любом языке программирования, который поддерживает разработку COM-компонентов, например, Delphi, C++, Visual Basic и т. Д.

Я не знаком с этим, так что не воспринимайте это как Евангелие, но, похоже, благодаря магии компиляции, вызванной CoClass атрибут, вы создаете экземпляр SpVoiceClass когда кажется, что вы создаете экземпляр интерфейса.

Если вы можете сделать SpVoice speak= new SpVoice() и не получили ошибку, то это означает, что SpVoice имеет конструктор, что означает, что это НЕ интерфейс.

Не забирай вещь "Я" слишком далеко. Это просто соглашение об именах. Возможно, spVoice - это не интерфейс. Могу ли я узнать, как вы пришли к выводу, что spVoice действительно является интерфейсом?

Если это интерфейс, он не может быть создан.

Другие вопросы по тегам