如何在基础 class 上使用泛型时将函数从一个接口应用到另一个接口?
How to apply functions from one interface to another interface while using generics on a base class?
我有两个来自第三方的接口,它们具有相同的功能。由于这是第三方接口,我没有能力附加父接口。
public interface IInterface1 {
int Open(string stringName);
}
public interface IInterface2 {
int Open(string stringName);
}
我想将它们传递到基地 class
public class MyClass : BassClass<IInterfaceWithOpenFunction>
这样我就可以在两个 class 上以相同的方式执行完全相同的功能。
public class BassClass<T> Where T : IInterfaceWithOpenFunction, new()
{
private T item;
public BaseClass(string stringName)
{
item = new T();
item.open(stringName);
我不想让项目动态化,因为我想保留智能感知,我该如何实现?
IInterfaceWithOpenFunction 不知何故需要消耗其他接口的功能打开,同时允许我传入所需的接口来实现。
为了实现这一点,您可以做的是创建自己的 "parent" 接口和派生的 classes,每个都适合那些不同的第三方 classes。本质上,您对不同的非相关接口有不同的包装器:
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);
}
然后是你的基地 class:
public class BassClass<T> Where T : IInterface
在上述实施中,第三方接口的特定实例作为包装器的依赖项提供。通过这样做,IInterfaces
上的实现没有默认构造函数,因此您需要删除 new()
通用约束。还有其他方法可以实现它,例如通过属性而不是构造函数传递依赖项。不同的方式各有利弊,大家可以对照一下。
至于你的这部分代码:
item = new T();
item.open(stringName);
我认为也许您不应该像您正在做的那样初始化类型,您宁愿让 class 持有对已初始化类型的引用。可能是我展示的包装器 classes 可以替换您当前拥有的 BaseClass
。
如果您坚持使用智能感知和单一管理器来管理它们,那么可以这样做:
public class Provider1Wrapper : IInterfaceWithOpenFunction
{
private Provider1 _provider; // Instance\Inject via CTOR
public int Open(string stringName)
{
return _provider.Open(stringName);
}
}
public class Provider2Wrapper : IInterfaceWithOpenFunction
{
private Provider2 _provider; // Instance\Inject via CTOR
public int Open(string stringName)
{
return _provider.Open(stringName);
}
}
public static class ProviderManager<T> where T : IInterfaceWithOpenFunction, new()
{
public static int Open(string stringName)
{
T providerWrapper = new T();
return providerWrapper.Open(stringName);
}
}
void Main()
{
var result = ProviderManager<Provider2Wrapper>.Open(stringName);
}
我有两个来自第三方的接口,它们具有相同的功能。由于这是第三方接口,我没有能力附加父接口。
public interface IInterface1 {
int Open(string stringName);
}
public interface IInterface2 {
int Open(string stringName);
}
我想将它们传递到基地 class
public class MyClass : BassClass<IInterfaceWithOpenFunction>
这样我就可以在两个 class 上以相同的方式执行完全相同的功能。
public class BassClass<T> Where T : IInterfaceWithOpenFunction, new()
{
private T item;
public BaseClass(string stringName)
{
item = new T();
item.open(stringName);
我不想让项目动态化,因为我想保留智能感知,我该如何实现?
IInterfaceWithOpenFunction 不知何故需要消耗其他接口的功能打开,同时允许我传入所需的接口来实现。
为了实现这一点,您可以做的是创建自己的 "parent" 接口和派生的 classes,每个都适合那些不同的第三方 classes。本质上,您对不同的非相关接口有不同的包装器:
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);
}
然后是你的基地 class:
public class BassClass<T> Where T : IInterface
在上述实施中,第三方接口的特定实例作为包装器的依赖项提供。通过这样做,IInterfaces
上的实现没有默认构造函数,因此您需要删除 new()
通用约束。还有其他方法可以实现它,例如通过属性而不是构造函数传递依赖项。不同的方式各有利弊,大家可以对照一下。
至于你的这部分代码:
item = new T();
item.open(stringName);
我认为也许您不应该像您正在做的那样初始化类型,您宁愿让 class 持有对已初始化类型的引用。可能是我展示的包装器 classes 可以替换您当前拥有的 BaseClass
。
如果您坚持使用智能感知和单一管理器来管理它们,那么可以这样做:
public class Provider1Wrapper : IInterfaceWithOpenFunction
{
private Provider1 _provider; // Instance\Inject via CTOR
public int Open(string stringName)
{
return _provider.Open(stringName);
}
}
public class Provider2Wrapper : IInterfaceWithOpenFunction
{
private Provider2 _provider; // Instance\Inject via CTOR
public int Open(string stringName)
{
return _provider.Open(stringName);
}
}
public static class ProviderManager<T> where T : IInterfaceWithOpenFunction, new()
{
public static int Open(string stringName)
{
T providerWrapper = new T();
return providerWrapper.Open(stringName);
}
}
void Main()
{
var result = ProviderManager<Provider2Wrapper>.Open(stringName);
}