c# - 方法的通用接口(interface)重载?

标签 c# interface generics overloading

是否有一种好的、通用的方法可以在不诉诸第二种方法或大量强制转换的情况下执行以下操作 - 我想使 API 尽可能轻便,并且在我看来 OO-wise 没问题:

class Foo
{
  public T Bar<T>() where T: IAlpha
  {
    /* blahblahblah */
  }

  public T Bar<T>() where T: IBeta
  {
    /* blahblahblah */
  }
}

interface IAlpha
{
  string x {set;}
}

interface IBeta
{
  string y {set;}
}

谢谢

最佳答案

您不能仅通过返回值(泛型或非泛型)来重载方法。此外,不可能解析对 Bar 的调用,因为一个对象可以同时实现 IAlphaIBeta,所以使用重载是不可能的.

public class AlphaBeta : IAlpha, IBeta
{
    string x {set;}
    string y {set;}
}

// too ambiguous
AlphaBeta parkingLot = myFoo.Bar<AlphaBeta>();

下面的也行不通,因为方法只是返回类型不同

class Gar
{
    public string Foo()
    {
        return "";
    }

    public int Foo()
    {
        return 0;
    }
}

不幸的是,您最好的解决方案是使用不太通用的解决方案。命令模式在这里可能会很好地为您服务。

public class Foo
{
    private readonly static Dictionary<Type, Command> factories =
        new Dictionary<Type, Command>();

    static Foo()
    {
        factories.Add(typeof(IAlpha), new AlphaCreationCommand());
        factories.Add(typeof(IBeta), new BetaCreationCommand());
    }

    public T Bar<T>()
    {
        if (factories.ContainsKey(typeof(T)))
        {
            return (T) factories[typeof(T)].Execute();
        }
        throw new TypeNotSupportedException(typeof(T));
    }
}

// use it like this
IAlpha alphaInstance = myFoo.Bar<IAlpha>();
IBeta betaInstance = myFoo.Bar<IBeta>();

另一种实现 Bar 的方法允许您在不显式声明类型(在尖括号中)的情况下调用它,是使用 out 参数。然而,我会避免它,因为 100% 管理的输出参数通常是糟糕的设计。

public void Bar<T>(out T returnValue)
{
    if (factories.ContainsKey(typeof(T)))
    {
        returnValue = (T) factories[typeof(T)].Execute();
        return;
    }
    throw new TypeNotSupportedException(typeof(T));
}

// call it like this
// T is inferred from the parameter type
IAlpha alphaInstance;
IBeta betaInstance;
myFoo.Bar(out alphaInstance);
myFoo.Bar(out betaInstance);

我排除了 CommandAlphaCreationCommandBetaCreationCommandTypeNotSupportedException。它们的实现应该是相当不言自明的。

或者,您可以使用 Func 而不是 Command,但这会迫使您在 Foo 中实现所有实例化代码,随着代码库的增长,这可能会失控。

关于c# - 方法的通用接口(interface)重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/940253/

相关文章:

reactjs - react typescript : FunctionComponent with templated props

c# - 如何使用runco​​mmand在mongodb上搜索

c++ - 如何从实现与其他接口(interface)共享的接口(interface)的类继承

C# 获取所有具有共同属性的项目

c++ - 具有相同概念的类(class)过多

sockets - HTML5 Web 套接字接口(interface)如何工作?

java - 为什么涉及泛型的这个会出现编译时错误?

java - Kotlin 中具有两个类型参数的泛型类

c# - 如何将运算符函数添加到原始数据类型 C#

c# - 碰撞中的Unity2D AudioSource