我想优化以下序列,因为运行时具有线性增长,我添加的操作越多。有没有更聪明的方法在同一个类中实现它而不使用更多的辅助类/模式? 提前致谢(对编辑感到抱歉......)!
public void SomeMethod(ClassZero foo)
{
var targetName = "";
var a = foo as ClassA;
if (a != null) targetName = a.DoSomething();
var b = foo as ClassB;
if (b != null) targetName = b.DoSomethingElse();
var c = foo as ClassC;
if (c != null) targetName = c.DoSomethingEntirelyElse();
var d = foo as ClassD;
if (c != null) targetName = d.DoSomethingInAnotherParallelWorld();
var furtherUse = localVariable.Process(targetName);
}
答案 0 :(得分:4)
理想情况下,不是询问类型的基类并选择不同的公共方法,而是在基类(或者更好的是,接口)上进行单个方法调用,无论底层实现如何都可以调用。
通常,这称为多态,在将多个派生类作为基类进行交互时,可以将它们视为相同。
public void SomeMethod(ClassZero foo)
{
var targetName = "";
targetName = foo.GetTargetName();
var furtherUse = localVariable.Process(targetName);
}
其他地方:
public abstract class ClassZero
{
public abstract string GetTargetName();
}
public class ClassA : ClassZero
{
public override string GetTargetName()
{
return DoSomething();
}
}
public class ClassB : ClassZero
{
public override string GetTargetName()
{
return DoSomethingElse();
}
}
或者,您可以使用界面。这通常是首选,因为它是一个关于类的显式契约,它提供了一个函数,在这种情况下,获取一个TargetName。与在抽象基类上使用抽象方法相比,它稍微不那么混淆了。如果您不拥有ClassZero基类,那也很好。
public interface ITargetNameGenerator
{
string GetTargetName();
}
public void SomeMethod(ITargetNameGenerator foo)
{
var targetName = "";
targetName = foo.GetTargetName();
var furtherUse = localVariable.Process(targetName);
}
public class ClassA : ClassZero, ITargetNameGenerator
{
public string GetTargetName()
{
return DoSomething();
}
}
//etc...