【发布时间】:2011-03-09 08:14:37
【问题描述】:
抱歉标题含糊不清,但我不知道如何用一句话来概括这一点。我有很多冗余 C# 代码的情况,它看起来确实像某种巧妙的技巧,使用某些继承或泛型属性可以解决这个问题。但是,我不是一个非常有经验的程序员(尤其是 C#),只是不太了解解决方案。
情况,以简化的形式,看起来像这样。我有一堆类都继承自一种类型。
public class Foo : SuperFoo
{
...
public Foo SomeMethod() { ... }
}
public class Bar : SuperFoo
{
...
public Bar SomeMethod() { ... }
}
public class Baz : SuperFoo
{
...
public Baz SomeMethod() { ... }
}
...
public class SuperFoo
{
...
}
当需要处理这些对象的集合时,问题就出现了。我的第一稿解决方案(糟糕的)如下所示:
public void SomeEventHasHappened(...)
{
ProcessFoos();
ProcessBars();
ProcessBazes();
...
}
public void ProcessFoos()
{
...
foreach (var foo in fooList)
{
...
foo.SomeMethod();
}
}
public void ProcessBars()
{
...
foreach (var bar in barList)
{
...
bar.SomeMethod();
}
}
...等等。问题是 ProcessX 方法中的所有代码基本上都是相同的,除了正在操作的对象的类型。出于显而易见的原因,将所有这些合并到一种方法中会很好。
我的第一个想法是创建一个通用的 Process() 方法,该方法将 List<SuperFoo> 作为参数,然后从那里继续。问题是泛型 SuperFoo 没有 SomeMethod(),它也没有 SomeMethod(),因为每个子类的 SomeMethod() 都有不同的返回类型,所以覆盖不起作用。
【问题讨论】:
-
我见过返回
object的代码,然后转换为适当的类型。 -
虽然这可以解决我在这里提出的问题,但我应该澄清一下...我宁愿不让
SomeMethod()返回一般的object,因为SomeMethod()是除了这部分代码之外,还需要在许多其他地方调用,这需要在所有其他地方进行强制转换。不过,感谢您的建议。