接口不能实例化?

liuzhenpolestar 2011-05-16 09:45:59
IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();

虽然明明知道,接口是不能实例化的,但是我今天又看到了将接口new的语句,而且代码可以正常运行,没有任何错误。第一次见到将接口new是在将datagridview里的数据导入excel里时:

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
而且也能正常运行。

真是搞不懂,明明接口不能实例化,那为什么却能像实例化类一样实例化接口呢???而且完全正常使用。这到底是“实例化”吗??
...全文
909 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
江湖评谈 2013-03-19
  • 打赏
  • 举报
回复
好像已经结贴了? 在.net里面非托管转换成托管的接口用CoClass标记接口转换成类,所以excel.application 实例化是可以的。
斯内科 2012-04-01
  • 打赏
  • 举报
回复
//托管代码中的interface不能实例化 但在COM中包装过的(非托管代码)接口是可以实例化的
WComm_Serial.CWComm_Serial wserial = new WComm_Serial.CWComm_Serial();
微耕门禁机包装的COM类CWComm_Serial 转到定义是接口
但在C或C++中本只是个类。
因此只能理解成CWComm_Serial 是个类
随枫而来 2011-08-17
  • 打赏
  • 举报
回复
学习了,最近也学接口!
luafie 2011-07-04
  • 打赏
  • 举报
回复
这个要设置一个嵌入式属性为false才可以的,要不然就报错。编译都通不过。
极地_雪狼 2011-05-16
  • 打赏
  • 举报
回复
又学到点东西。
liuzhenpolestar 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xu56180825 的回复:]

Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
我定义的时候是类而不是接口,你确定EXCEL能Microsoft.Office.Interop.Excel.Application app = new Microso……
[/Quote]
哥哥,我真的确定!!不信你试试!所以我才感到很奇怪的。因为网上的代码都是那样子的。
遥望那些年 2011-05-16
  • 打赏
  • 举报
回复
对于原有的Com文件,比如ABC.dll
当你在.net 环境下引用的时候,你会发现,实际引用的文件是Interop.ABC.dll
这正是由于.net在中间做了处理,将原来的ABC.dll翻译为了.Net可以识别的元数据清单
xu56180825 2011-05-16
  • 打赏
  • 举报
回复
Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
我定义的时候是类而不是接口,你确定EXCEL能Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
定义?
 Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.WorkbookClass ExcelWorkBook = (Microsoft.Office.Interop.Excel.WorkbookClass)ExcelApp.Workbooks.Open(XlsPath, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value
, Missing.Value, Missing.Value, Missing.Value);
Microsoft.Office.Interop.Excel.Worksheet ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets[SheetIndex];
liuzhenpolestar 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fangxinggood 的回复:]

同理啊,所有COM的Interface另当别论了。
[/Quote]

这个太深奥了,搞不懂,我还是先把COM的Interface理解为类吧。
threenewbee 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fangxinggood 的回复:]
COM的接口是通过包装实例化,.net 做了些翻译。

Microsoft.Office.Interop.Excel 的定义:

C# code
public interface Application : _Application, AppEvents_Event


http://msdn.microsoft.com/zh-cn/library/microsoft.office……
[/Quote]
学习。
liuzhenpolestar 2011-05-16
  • 打赏
  • 举报
回复
哦,那我以后在见到类似与Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();的语句后,可以把Application理解为类而不是接口了。我还是比较喜欢把它写为new Microsoft.Office.Interop.Excel.ApplicationClass(),省得误解。
机器人 2011-05-16
  • 打赏
  • 举报
回复
.NET提供Interop 程序集,它用作托管和非托管代码之间的桥梁,将 COM 对象成员映射为等价的 .NET 托管成员。
机器人 2011-05-16
  • 打赏
  • 举报
回复
同理啊,所有COM的Interface另当别论了。

liuzhenpolestar 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kingdyw 的回复:]

因为EngineFeatureSnap类 实现了 IEngineFeatureSnapAgent 接口。
通过 IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap(); 这句话 对象featureSnapAgent 就可以 调用接口IEngineFeatureSnapAgent 里定义的方法和属性了。
如果这个类 ……
[/Quote]
在vs里,EnginFeatureSnap显示的是个接口,而不是类啊!
GiSeRInQuZhou 2011-05-16
  • 打赏
  • 举报
回复
接口 实例 = new 实现接口的类A()
接口 实例 = new 实现接口的类B()
接口 实例 = new 实现接口的类C()
这样的逻辑就是说,我们需要某个类,所以我们每次实例化它。

如果把 ABC这三个类,再用一个类封D装起来,会怎么样呢?

接口 实例 = D.A
接口 实例 = D.B
接口 实例 = D.C

我们还是需要某个类,但是,我们不需要每次都实例化了,只需要找D“拿”就行
GiSeRInQuZhou 2011-05-16
  • 打赏
  • 举报
回复
而且通过接口来实例化对象 这个也是多态的表现。
PS
实现接口的类 实例 = new 实现接口的类()
遥望那些年 2011-05-16
  • 打赏
  • 举报
回复
IList<string> list = new List<string>();
注意这里是用List类型实例化IList,不是用IList本身实例化。

对于用VB 6等写的com类型,.Net环境下,会有特殊的机制处理,因此可以实例化.Net处理后的生成的Com接口
机器人 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fangxinggood 的回复:]

COM的接口是通过包装实例化,.net 做了些翻译。

Microsoft.Office.Interop.Excel 的定义:
C# code
public interface Application : _Application, AppEvents_Event


http://msdn.microsoft.com/zh-cn/library/microsoft.office.i……
[/Quote]

所以实例化的是 ApplicationClass
GiSeRInQuZhou 2011-05-16
  • 打赏
  • 举报
回复
因为EngineFeatureSnap类 实现了 IEngineFeatureSnapAgent 接口。
通过 IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap(); 这句话 对象featureSnapAgent 就可以 调用接口IEngineFeatureSnapAgent 里定义的方法和属性了。
如果这个类 还实现了别的接口 那么可以通过query interface 调用别的接口的方法和属性了。
机器人 2011-05-16
  • 打赏
  • 举报
回复
COM的接口是通过包装实例化,.net 做了些翻译。

Microsoft.Office.Interop.Excel 的定义:
public interface Application : _Application, AppEvents_Event


http://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.application.aspx

[CoClass(typeof(ApplicationClass))]
[Guid("000208D5-0000-0000-C000-000000000046")]
public interface Application : _Application, AppEvents_Event
{
}
加载更多回复(4)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧