首页 > 解决方案 > 如何在基类上使用泛型时将函数从一个接口应用到另一个接口?

问题描述

我有两个来自第三方的具有相同功能的接口。由于这是第三方接口,我无法附加父接口。

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 需要消耗其他接口的函数打开,同时允许我传入所需的接口来实现。

标签: c#genericsinheritanceinterfacebase-class

解决方案


为了实现这一点,您可以做的是创建自己的“父”接口和派生类,每个类都适用于那些不同的第三方类。本质上,对于不同的非相关接口,您有不同的包装器:

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您当前拥有的包装类。


推荐阅读