代码之家  ›  专栏  ›  技术社区  ›  Demodave

在基类上使用泛型时,如何将函数从一个接口应用到另一个接口?

  •  1
  • Demodave  · 技术社区  · 6 年前

    我有两个来自具有相同功能的第三方的接口。因为这是第三方的接口,所以我不能附加父接口。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Gilad Green Fábio    6 年前

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

    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 您目前有。

        2
  •  0
  •   Amir Popovich    6 年前

    如果您坚持使用IntelliSense和单个管理器来管理所有这些功能,那么类似这样的功能可以做到:

    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);
    }