It looks like I'm instantiating this SpeechAPI

2019-03-31 07:25发布

问题:

I am using Microsoft Text-to-Text Speech feature in my project. But I have a question about that, actually not directly about that. So :

Normally programmers when creating Interface, they put I as a prefix of the interface name like IReadable,IEnumerator etc. But I've come across something that actually shocked me.

in Microsoft Text Speech DLL there is something like this : SpVoice which is interface (they didn't put I as prefix for some reason and I don't know why ?) and SpVoiceClass. So then what's the problem you may ask, Here :

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

and

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

The thing I don't get is how ? How does the first one work although it says it is an interface with tons of unimplemented methods etc.

Please some one explain me HOW ?

I am really confused now and maybe Microsoft developers didn't put I prefix for that reason, it can be instantiated.

Thanks in advance. Hope I describe my problem clearly.

Here is the image that I want you to see :
(source: pixelshack.us)

回答1:

EDIT: Ah, I see. Look at the definition of SpVoice:

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

Then look up the CoClass attribute:

A coclass supplies concrete implementation(s) of one or more interfaces. In COM, such concrete implementations can be written in any programming language that supports COM component development, e.g. Delphi, C++, Visual Basic, etc.

I'm not familiar with this, so don't take this as gospel, but it appears that, through compiler magic triggered by the CoClass attribute, you're instantiating an instance of SpVoiceClass when it looks like you're instantiating an interface.



回答2:

If you can do SpVoice speak= new SpVoice() and didn't get an error, then it means SpVoice has a constructor, which means that is is NOT an interface.



回答3:

Dont take the "I" thing too far. Its just a naming convention. Perhaps spVoice is not an interface. May I know how you concluded spVoice is indeed an interface ?

If it is an interface it cant be instantiated.