更简单的方法来检查和调用重载方法
本文关键字:方法 调用 重载 检查和 更简单 | 更新日期: 2023-09-27 18:18:49
private void SomeMethod(DerivedA something) {...}
private void SomeMethod(DerivedB something) {...}
private void SomeMethod(DerivedC something) {...}
BaseClass bc = somevariable;
if (bc is DerivedA) Somemethod(bc as DerivedA)
else if (bc is DerivedB) Somemethod(bc as DerivedB)
else if (bc is DerivedC) Somemethod(bc as DerivedC)
...
else if (bc is DerivedZZ) Somemethod(bc as DerivedZZ)
在。net 3.5中,应该有一个更简单的方法,不是吗?
将someemethod作为类的成员方法是否合适?
如果DerivedA, DerivedB等…所有方法都共享相同的父类,那么您可以在父类中创建此方法作为虚拟成员方法,并在继承它的类中重写它。(这不是特定于。net 3.5 -或任何其他。net版本-这只是一个基本的OOP特性)
:
public class BaseClass
{
public virtual void SomeMethod()
{
Console.WriteLine ("BaseClass");
}
}
public class DerivedA : BaseClass
{
public override SomeMethod()
{
Console.WriteLine("DerivedA");
}
}
public class DerivedB : BaseClass
{
public override SomeMethod()
{
Console.WriteLine ("DerivedB");
}
}
BaseClass bc = someVariable;
bc.SomeMethod();
public class BaseClass {
public virtual void SomeMethod()
{
}
};
public class DerivedA : BaseClass {
public override void someMethod()
{ //Do DerivedA things
}
};
public class DerivedB : BaseClass {
public override void someMethod()
{ //Do DerivedB things
}
};
public class DerivedC : BaseClass {
public override void someMethod()
{ //Do DerivedC things
}
};
那么你可以这样做:
BaseClass bc = new BaseClass();
或
BaseClass bc = new DerivedA();
或
BaseClass bc = new DerivedB();
或
BaseClass bc = new DerivedC();
和调用:
bc.SomeMethod();
即使BC类型是BaseClass,如果您将其实例化为派生,派生方法也将被调用。这意味着继承和多态性。
这段代码和你的代码是等价的。
即使是你的,你也可以使用typeof();div;)
听起来你需要稍微重新考虑一下你是如何做事的;如果你有一些其他类需要使用这个BaseClass
,而不知道它包含什么类型的派生类,直到你调用一个方法,这似乎效率低下。
public abstract class BaseClass
{
public abstract void InitializeAndDoOtherStuff();
}
public abstract class DerivedA
{
public overload void InitializeAndDoOtherStuff()
{
// Initializes the control, pass whatever you need into this method, etc)
}
}
在这种情况下,您的代码看起来像这样:
BaseClass bc = someVariable;
bc.InitializeAndDoOtherStuff();
或
从代码管理的角度来看,这是一个可怕的想法,但是你可以这样做:
public class DerivedA : BaseClass, IControlA { }
public class DerivedB : BaseClass, IControlB { }
...
然后你的另一个类重载如下:
public void SomeMethod(IControlA control) { }
public void SomeMethod(IControlB control) { }
...
然后,在您的代码中,它将像这样简单:
BaseClass bc = someVariable;
SomeMethod(bc);
重载解析会处理它,因为适当的接口只在一个派生类上。 我也会像前面所说的那样重新设计你的类,但如果你不能这样做,你可以使用反射来完成这项工作
this.GetType().InvokeMember("SomeMethod", // Method name
BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod,
null, // DefaultBinder
this, // object to call the method on
new[]{ bc } // parameters to the method
);
如果someemethod不是一个公共实例方法,你需要相应地调整BindingFlags