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

问题描述 投票:3回答:3

我在我的项目中使用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

class interface instance
3个回答
7
投票

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

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

然后查找CoClass属性:

coclass提供一个或多个接口的具体实现。在COM中,这种具体实现可以用支持COM组件开发的任何编程语言编写,例如, Delphi,C ++,Visual Basic等

我不熟悉这一点,所以不要把它当作福音,但看起来,通过CoClass属性触发的编译器魔法,当你看来你正在实例化一个接口时,你实例化了SpVoiceClass的一个实例。


0
投票

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


0
投票

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

如果它是一个接口,它就无法实例化。

© www.soinside.com 2019 - 2024. All rights reserved.