2015-11-04 106 views
-2

问题标题可能不是很清楚,但这里是我想要做的:是否有可能重载基于另一种方法的方法?

说,我有一个静态类A。该类包含一个称为B的静态函数。它有10多个重载。尽管有这么多的过载,但这个功能非常基础。它与该班的其他成员无关。我知道我可以在任何地方通过导入正确的名称空间和使用访问:

string bar = A.B("foo", true, 5) // Then do whatever with bar 

现在,假设我有另一个类C(不在A)。现在我想在C中制定一个名为D的方法,其行为在所有方面与A.B相同。我曾尝试:

public static class C { 
    public static string D(string p1, bool p2, int p3) { 
     return A.B(p1, p2, p3); 
    } 
} 

但超载这个D方法一模一样A.B,我有什么做的?我是否必须手动编写所有单独的重载,还是有更好的方法?

+4

如果'C.D'“在所有方面与'A.B'表现相同,那么C.D'有什么用? –

+0

我知道这是毫无意义的,但仅仅是为了知识。假设我有五个嵌套类(我不认为会存在,但仍然)。我将不得不通过'AnIncrediblyLargeName.AnotherBigName.AnotherSubClass.YetAnotherSubClass.FinallyTheMethod'访问它们。所以要从'C'访问它们,我正在考虑创建一个'D'方法,以便我可以简单地调用'D'。 –

+1

我没有完全遵循,但是静态方法没有被继承,所以没有静态方法的继承或多态的机制。 –

回答

3

我将必须编写所有单独重载手动

如果你想拥有的DB每个重载过载,那么,你就必须这样做。

+0

是的,我认为是这样,但是D的每个重载也会与B的相应超载表现一样。那么即使没有可能? –

+1

或者将所有这些方法移到一个接口/类中去接收一些编译器援助 – Machinarius

+0

@ FarhanAnam没有语言支持可以让你避免它。您可以编写自己的代码生成工具(或查找第三方工具)为您生成该代码,但代码仍然需要以某种方式编写。 – Servy

-3

这是静态方法缺点的一个很好的例子。

如果可以,将这些静态方法转换为实例方法(可能是一些新的工作者类,使用静态工厂方法返回实例或使用IOC)。那么你将有更多的灵活性来使用继承来避免重复代码。

UPDATE

一些反馈后,我一想,它可能,一种。使用反射来获取参数列出了B的所有版本,并与D.

public static int D(params object[] paramArray) 
{ 
    var paramTypes = paramArray.Select(x => x.GetType()); 
    var method = typeof(Static.A).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy) 
     .Where(m => m.Name == "B" && m.GetParameters().Select(x => x.ParameterType).SequenceEqual(paramTypes)) 
     .FirstOrDefault(); 
    if (method != null) 
    { 
     return (int)method.Invoke(null, paramArray); 
    } 
    throw new Exception("Overloaded method not found"); 
} 

的参数列表进行比较这种方法的缺点是,没有编译时的参数检查,没有智能感知,等我不能想到变圆了这个的一种方式,而不重复的A.B()每个版本的规范中,像这样:

private static int GenericD(object[] paramArray, MethodBase caller) 
    { 
     var paramTypes = caller.GetParameters().Select(x => x.ParameterType); 
     var method = typeof(Static.A).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy) 
      .Where(m => m.Name == "B" && m.GetParameters().Select(x => x.ParameterType).SequenceEqual(paramTypes)) 
      .FirstOrDefault(); 
     if (method != null) 
     { 
      return (int)method.Invoke(null, paramArray); 
     } 
     throw new Exception("Overloaded method not found"); 
    } 

    public static int D(string p) 
    { 
     object[] paramArray = new object[] { p }; 
     return GenericD(paramArray, MethodInfo.GetCurrentMethod()); 
    } 

    public static int D(string p, int x) 
    { 
     object[] paramArray = new object[] { p, x }; 
     return GenericD(paramArray, MethodInfo.GetCurrentMethod()); 
    } 

在该溶液中,d的每一个版本()几乎是相同的,但不相当。理想情况下,您需要某种编程方式将方法参数列表转换为object[],但是需要there doesn't seem to be an easy way to do that

+0

你没有得到我害怕的问题。 –

+0

我明白你的问题是关于如何避免重复一段代码。我指出,如果使用静态方法/类,则避免重复自己的选项是有限的。为什么选择使类A静态或使用嵌套类有什么特别的原因吗? – mikeagg

+0

我无法编辑'A'。这是另一个图书馆的课程。 –

-1

为什么不让你的基本方法成为一个泛型类型的扩展方法,然后在单个扩展方法中简单地实现任何类型特定的逻辑?

+0

为什么不在不知道这不是代码优化问题的情况下回答。 –

+0

我以为这个问题是关于如何以可重复的方式使用静态方法。使用带泛型的扩展方法是实现可重复技术的最简单方法。这不是关于代码优化,而是关于如何理解静态,扩展和重载的基础知识。 –

+0

好的,但是我的问题的最后两行不是很清楚吗? –

相关问题