我在我的项目中使用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.
我没有得到的是如何?第一个如何工作虽然它说它是一个包含大量未实现方法等的接口。
请有人解释我怎么样?
我现在真的很困惑,也许微软的开发人员没有把我的前缀放在那个原因上,它可以被实例化。
提前致谢。希望我清楚地描述我的问题。
这是我想让你看到的图像: (来源:pixelshack.us)
编辑:啊,我明白了。看看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确实是一个界面?
如果它是一个接口,它就无法实例化。