It looks like I'm instantiating this SpeechAPI interface. How is that possible?
Asked Answered
P

3

3

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 : alt text
(source: pixelshack.us)

Puli answered 6/6, 2009 at 3:40 Comment(4)
Is this C#? You can't instantiate interfaces then, no question about it.Dworman
Yeah I know but why is it like that ?Puli
Where did you get SpeechLib from?Donley
Microsoft Speech Object Library from COMPuli
D
7

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.

Donley answered 6/6, 2009 at 3:56 Comment(5)
I just imported Microsoft Speech Object Library into my project from COM.Puli
and you can see the SpVoiceClass from the picture I put.Puli
and would you tell me why I'd need a coclass ?Puli
Do you mean, why does that attribute exist on that class when you could simply instantiate SpVoiceClass? I don't know, but I'd guess convenience - maybe an old, primitive way to implement a Factory pattern.Donley
Well according to what I've just read, it must be used when declaring COM Classes in your wrapper library.Puli
T
0

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.

Tarsometatarsus answered 6/6, 2009 at 3:52 Comment(2)
It's an interface. You can check it out yourself if you don't believe me.Puli
I edited my initial post and put a picture of it. Right below my question you can see the Hint when I bring the mouse over the instance.Puli
T
0

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.

Teflon answered 6/6, 2009 at 3:57 Comment(1)
I put the real and exact picture of it.Puli

© 2022 - 2024 — McMap. All rights reserved.