c# - 如何在基类上使用泛型时将函数从一个接口应用到另一个接口?
问题描述
我有两个来自第三方的具有相同功能的接口。由于这是第三方接口,我无法附加父接口。
public interface IInterface1 {
int Open(string stringName);
}
public interface IInterface2 {
int Open(string stringName);
}
我想将它们传递给基类
public class MyClass : BassClass<IInterfaceWithOpenFunction>
这样我就可以以相同的方式在两个类上执行相同的功能。
public class BassClass<T> Where T : IInterfaceWithOpenFunction, new()
{
private T item;
public BaseClass(string stringName)
{
item = new T();
item.open(stringName);
我不想让项目动态化,因为我想保持智能感知,我该如何实现?
不知何故,IInterfaceWithOpenFunction 需要消耗其他接口的函数打开,同时允许我传入所需的接口来实现。
解决方案
为了实现这一点,您可以做的是创建自己的“父”接口和派生类,每个类都适用于那些不同的第三方类。本质上,对于不同的非相关接口,您有不同的包装器:
public interface IInterfaces
{
int Open(string stringName);
}
public class DerivedForInterface1 : IInterfaces
{
private IInterface1 _instance;
public DerivedForInterface1(IInterface1 instance)
{
_instance = instance;
}
public int Open(string stringName) => _instance.Open(stringName);
}
public class DerivedForInterface2 : IInterfaces
{
private IInterface2 _instance;
public DerivedForInterface2(IInterface2 instance)
{
_instance = instance;
}
public int Open(string stringName) => _instance.Open(stringName);
}
然后你的基类:
public class BassClass<T> Where T : IInterface
在上述实现中,第三方接口的特定实例作为包装器的依赖项提供。通过这样做,没有实现IInterfaces
具有默认构造函数,因此您需要删除new()
通用约束。还有其他实现它的方法,例如通过属性而不是构造函数传递依赖项。不同的方式各有优缺点,大家可以对照一下。
至于这部分代码:
item = new T();
item.open(stringName);
我认为也许不是像你正在做的那样初始化类型,而是让你的类持有对初始化类型的引用。可能是我展示的包装类可以替换BaseClass
您当前拥有的包装类。
推荐阅读
- java - 杰克逊自定义解串器空编解码器
- semantic-ui - Semantic UI - Font Awesome 许可证的状态是什么?
- excel - 带有 MS Excel 后端的 Visual Studio 界面,供多个用户同时运行
- javascript - moment-timezone America/Sao_Paulo 时区偏移错误
- perl - Perl 模块/子例程删除字符串的共享子字符串
- r - 我希望拆分列表的名称并按顺序分配它们 R
- robotframework - 是否可以在 Robot Framework 中复制对象?
- python - 在 for 循环中的字典中添加数据框行?
- c# - SQL Server 报告中具有相同颜色的两行
- sql - 将项目及其类别组合成单列