扩展现有接口
本文关键字:接口 扩展 | 更新日期: 2023-09-27 17:51:00
我遇到了一个问题。我在我的程序中使用一个外部库,它提供了一个接口,IStreamable(我没有这个接口的源代码)。
然后在我创建的DLL中实现接口,DFKCamera类。
在我当前的程序中(不幸的是我不能完全修改,因为我只是为它编写一个插件),我只能访问在接口IStreamable中定义的DFKCamera的那些方法。然而,我需要访问我在DFKCamera中为我的插件工作编写的不同方法(程序的其余部分不使用的方法,因此在IStreamable中没有定义)。
在c#中扩展接口的定义是可能的吗?如果我可以扩展IStreamable接口,那么我就可以访问这个新方法了。事实上,情况是这样的:
//In ProgramUtils.DLL, the IStreamable interface is defined
//I have only the .DLL file available
namespace ProgramUtils {
public interface IStreamable {
//some methods
}
}
//In my DFKCamera.DLL
using ProgramUtils;
class DFKCamera: IStreamable {
//the IStreamable implementation code
....
//the new method I wish to add
public void newMethod() {}
//In the the program that uses DFKCamera.DLL plugin
//The program stores plugin Camera objects as IStreamable DLLObject;
IStreamable DLLObject = new DFKCamera();
//This means that I cannot access the new method by:
DLLObject.newMethod(); //this doesn't work!
是否有一种方法来扩展istreamble接口与newMethod声明,即使我没有访问源的istreamble接口?
我知道可以使用部分接口定义来定义跨文件的接口,但是,只有在跨两个文件使用部分关键字并且这些文件在单个。dll中编译时才有效
我希望这足够清楚!
您可以使用扩展方法:
public static class IStreamableExtensions
{
public static void NewMethod(this IStreamable streamable)
{
// Do something with streamable.
}
}
您可以从自定义接口继承:
public interface IDFKStreamable : IStreamable
{
void NewMethod();
}
那么任何实现自定义接口的对象也必须实现IStreamable
,你可以在你的代码中使用自定义接口:
public class DFKCamera : IDFKStreamable
{
// IStreamable methods
public void NewMethod() {}
}
// elsewhere...
IDFKStreamable DLLObject = new DFKCamera();
DLLObject.NewMethod();
因为它仍然是一个IStreamable
,你应该仍然可以在现有的代码中使用它:
someOtherObject.SomeMethodWhichNeedsAnIStreamable(DLLObject);
在需要使用newMethod()的时候,为什么不直接将其转换回DFKCamera,以便您可以使用它?
IStreamable DLLObject = new DFKCamera();
((DFKCamera)DLLObject).newMethod();