看起来我正在实例化这个SpeechAPI接口。怎么可能?

时间:2009-06-06 03:40:09

标签: class interface instance

我在我的项目中使用Microsoft文本到文本语音功能。但我有一个问题,实际上并不是直接的。所以:

通常程序员在创建Interface时,会把我作为接口名称的前缀,比如IReadable,IEnumerator等。但是我遇到了让我感到震惊的东西。

在Microsoft Text Speech DLL中有这样的东西:SpVoice是接口(由于某些原因我们不把我作为前缀,我不知道为什么?)和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.

我没有得到的是如何?第一个如何工作虽然它说它是一个包含大量未实现方法等的接口。

请有人解释我如何?

我现在真的很困惑,也许微软的开发人员没有把我的前缀放在那个原因上,它可以被实例化。

提前致谢。 希望我能清楚地描述我的问题。

以下是我希望您看到的图片: alt text
(来源:pixelshack.us

3 个答案:

答案 0 :(得分:7)

编辑:啊,我明白了。看看SpVoice的定义:

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

然后查找CoClass属性:

  

一个coclass供应混凝土   一个或多个的实施   接口。在COM中,这样的具体   实现可以用任何方式编写   支持COM的编程语言   组件开发,例如德尔福,   C ++,Visual Basic等

我对此并不熟悉,所以不要将其视为福音,但似乎通过CoClass属性触发的编译器魔法,您实例化SpVoiceClass的实例当你看起来像是在实例化一个界面时。

答案 1 :(得分:0)

如果你能做SpVoice speak = new SpVoice()并且没有得到错误,那么这意味着SpVoice有一个构造函数,这意味着它是 NOT 一个接口。

答案 2 :(得分:0)

不要把“我”的事太过分了。它只是一个命名惯例。 也许spVoice不是一个界面。我可以知道你如何总结spVoice确实是一个界面?

如果是接口,则无法实例化。