C# 来自静态上下文的虚拟方法

C# 来自静态上下文的虚拟方法,c#,oop,C#,Oop,我有一个BaseProgram,它充当所有其他程序的基类。 我想向此类添加一个可重写的方法HandleException(),以进行错误处理。 从该BaseProgram派生的所有程序都应该可以选择编写自己版本的HandleException() 因此,我必须声明HandleException()为virtual方法,如下所示: abstract class BaseProgram { public abstract void Run(); public static void

我有一个
BaseProgram
,它充当所有其他程序的基类。
我想向此类添加一个可重写的方法
HandleException()
,以进行错误处理。
从该BaseProgram派生的所有程序都应该可以选择编写自己版本的
HandleException()

因此,我必须声明
HandleException()
virtual
方法,如下所示:

abstract class BaseProgram
{
    public abstract void Run();

    public static void RunWithExceptionHandling(BaseProgram programToRun)
    {
        try
        {
            //do some processing 
            programToRun.Run();
        }
        catch (Exception)
        {
           HandleException();  //Error : Can't access non-static method in static context
        }
    }

    public virtual void HandleException()
    { 
        //Do some basic exception handling here
    }
}
但是我不能在静态方法的catch块中调用这个新的虚拟方法:
RunWithExceptionHandling()
此外,由于应用程序设计的原因,我无法将
RunWithExceptionHandling
static
更改为非
static
:-(


你知道如何解决这个问题吗?这样我就可以允许派生类拥有自己版本的
HandleException()

好吧,你有实例;你只需要使用它来调用方法。如果存在的话,这将调用
HandleException
的派生版本

public static void RunWithExceptionHandling(BaseProgram programToRun)
{
    try
    {
        //do some processing 
        programToRun.Run();
    }
    catch (Exception)
    {
       programToRun.HandleException();//Use the instance :)
    }
}

好的,你有这个实例;你只需要使用它来调用这个方法。如果存在的话,这将调用
HandleException
的派生版本

public static void RunWithExceptionHandling(BaseProgram programToRun)
{
    try
    {
        //do some processing 
        programToRun.Run();
    }
    catch (Exception)
    {
       programToRun.HandleException();//Use the instance :)
    }
}

为什么不在catch子句中调用programToRun.HandleException()?是的,您不能用静态声明的方法来实现。理想情况下,您应该创建一个非静态类并在其子类中重写它。为什么不能将设计更改为一个正确设计的类?为什么不直接调用programToRun.HandleException()在您的catch子句中?是的,您不能使用静态声明的方法执行此操作。理想情况下,您应该创建一个非静态类,并在其子类中重写它。为什么不能将设计更改为一个正确的设计类?解决方法很好,但这里需要考虑的是,您正在为此方法提供对BaseProgram实例的完全访问权限。理想情况下,您希望避免这种情况。它有很大的可能会误用/滥用实例(在不应该的情况下调用其他方法等等),并且通常不会“感觉”这样做的正确方式(但正如我所说,这是一种变通方法!)@Ahmedilyas我想知道做这件事的正确方法是什么?用所需的方法提取一个接口并使用它?或者其他什么?我看不出有任何问题,因为方法名是
RunWithExceptionHandling
它只调用
Run
HandleException
;这两个操作都是从名称本身传递过来的,不是吗?确定吗但我想说的是,它更容易被其他开发人员滥用,或者在应用程序的生命周期中被滥用。正确的方法当然是在第一个实例中正确地设计它:)很好的解决方法,但是这里的问题是,您正在给这个方法完全访问BaseProgram实例的权限。理想情况下,您希望避免这种情况。它很有可能会误用/滥用实例(在不应该的时候调用其他方法等等),而且通常情况下,它“感觉”不到正确的方法(但正如我所说,这是一种变通方法!)@Ahmedilyas我想知道什么是正确的方法?使用所需的方法提取接口并使用它?还是别的什么?我没有看到任何问题,因为方法名是
RunWithExceptionHandling
它只调用
Run
HandleException
;这两个动作都是从名称本身传达出来的,不是吗?当然,但我想说的是,它更容易被其他开发人员滥用或滥用,或者在应用程序的生命周期内。正确的方法当然是首先正确地设计它:)