【问题标题】:It looks like I'm instantiating this SpeechAPI interface. How is that possible?看起来我正在实例化这个 SpeechAPI 接口。这怎么可能?
【发布时间】:2009-06-06 03:40:09
【问题描述】:

我在我的项目中使用 Microsoft Text-to-Text Speech 功能。但我有一个问题,实际上不是直接的。所以:

通常程序员在创建接口时,会将 I 作为接口名称的前缀,例如 IReadable、IEnumerator 等。但我遇到了一些令我震惊的事情。

在 Microsoft Text Speech DLL 中有类似这样的内容:SpVoice,它是接口(出于某种原因,他们没有将 I 作为前缀,我不知道为什么?)和 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.

我不明白的是如何?第一个是如何工作的,尽管它说它是一个包含大量未实现方法等的接口。

请有人解释一下如何?

我现在真的很困惑,也许微软开发人员没有为此加上 I 前缀,它可以被实例化。

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

这是我想让你看到的图片:
(来源:pixelshack.us

【问题讨论】:

  • 这是 C# 吗?那么你就不能实例化接口,这毫无疑问。
  • 是的,我知道,但为什么会这样?
  • 你从哪里得到 SpeechLib?
  • 来自 COM 的 Microsoft 语音对象库

标签: class interface instance


【解决方案1】:

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

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

然后查找CoClass属性:

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

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

【讨论】:

  • 我刚刚将 Microsoft Speech Object Library 从 COM 导入到我的项目中。
  • 你可以从我放的图片中看到SpVoiceClass。
  • 谢谢你帮了我这么多。祝你有美好的一天:)
  • 你能告诉我为什么我需要一个 coclass 吗?
  • 您的意思是,当您可以简单地实例化 SpVoiceClass 时,为什么该属性会存在于该类中?我不知道,但我猜很方便——可能是实现工厂模式的一种古老、原始的方式。
【解决方案2】:

如果您可以执行 SpVoice speak= new SpVoice() 并且没有收到错误,则表示 SpVoice 有一个构造函数,这意味着它不是接口。

【讨论】:

  • 这是一个界面。不信你可以自己去看看。
  • 我编辑了我最初的帖子并放了一张照片。当我将鼠标移到实例上时,您可以在我的问题下方看到提示。
【解决方案3】:

不要把“我”的东西看得太远。它只是一个命名约定。 也许 spVoice 不是一个接口。请问您是如何得出结论的 spVoice 确实是一个接口?

如果它是一个接口,它不能被实例化。

【讨论】:

  • 我把它的真实和准确的图片。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多