更简单的方法来检查和调用重载方法

本文关键字:方法 调用 重载 检查和 更简单 | 更新日期: 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