【发布时间】:2021-11-08 14:04:45
【问题描述】:
首先,我对堆栈溢出和 C# 编程非常陌生..
目前正在尝试使用带有 C# 的某些设备制作程序, 但是在他们的 SDK 示例代码中有一些关于接口使用的问题我不明白..
以下是 DLL 中的接口:
interface ICanChannel2 : ICanSocket2, IBalResource, IDisposable
{
blah blah
}
interface ICanSocket2 : IBalResource, IDisposable
{
blah blah
}
interface IBalResource : IDisposable
{
blah blah
}
我实际上看不到界面中的内容,只能看到它们的名称。 以下是它的使用方法:
ICanChannel2 mCanChn = bal.OpenSocket() as ICanChannel2;
// (note that the return type of bal.openSocket() is IBalResource.)
这种情况就像将 IBalResource 强制转换为 ICanChannel2。
ICanChannel2 继承自 IBalResource 、 ICanSocket2 和 IDisposable。
IBalResource 是 ICanChannel2 的基础接口之一,是否可以强制转换? 到 ICanChannel2?
ICanChannel2 也不应该有 ICanSocket2 吗?哪个 IBalResource 没有?
顺便说一句,代码有效,我的大脑停止了..
【问题讨论】:
-
欢迎来到 StackOverflow。你在这里问什么并不完全清楚。 “可以将 X 转换为 Y” - 你试过吗?发生什么了?为什么这不符合您的预期?
-
任何实现接口
ICanChannel2的类也需要实现来自ICanSocket2, IBalResource, IDisposable的所有方法——而bal.OpenSocket()返回一个IBalResource,没有人禁止bal.OpenSocket()的实现实际上返回一个东西比 IBalResource 填充更多 - 它必须至少返回一个 IBalResource。如果它返回一些ICanChannel2实现,你可以做ICanChannel2 mCanChn = bal.OpenSocket() as ICanChannel2;,否则它将为空。 -
可能需要注意的一点是,您没有将
IBalResource转换为ICanChannel2,而是将bal.OpenSocket()返回的object 转换为ICanChannel2。该对象可以是实现IBalResource的任何类,也可以是实现ICanChannel2的类。请注意,对象属于(是)一个类并实现一个或多个接口。