如何在c#中调用基本重载方法?

Aid*_*des 4 c#

我有以下类层次结构

class A
{
    public virtual string M()
    {
        return M(String.Empty);
    }

    public virtual string M(string s)
    {
        return M(s, false);
    }

    public virtual string M(string s, bool flag)
    {
        // Some base logic here
    }
}

class B:A
{
    public override string M(string s, bool flag)
    {
        string baseResult = base.M(s);

        // Derived class logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

B类可用于两种情况:

1)

A b = new B();
string result = b.M();
Run Code Online (Sandbox Code Playgroud)

2)

B b2 = new B();
string result2 = b2.M(someString, true);
Run Code Online (Sandbox Code Playgroud)

这两种情况都会因StackOverflowException而崩溃.这是因为在BM内部调用的base.M(字符串s,bool标志)将再次调用BM(字符串s,bool标志).

有什么好方法可以避免这种情况吗?

我明白,如果我调用base.M(s,flag),一切都会起作用,但如果其他人开发了一个衍生类并访问base.M(s)怎么办?我不想在这里留下StackOverflowException的可能性.

现在我的层次结构看起来像

class A
{
    public string M()
    {
        return M(String.Empty, false);
    }

    public virtual string M(string s, bool flag)
    {
        // Some base logic here
    }
}

class B:A
{
    public override string M(string s, bool flag)
    {
        string baseResult = base.M(s, flag);

        // Derived class logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

通常这里的技巧是有一个 virtual(通常是参数最多的那个),这是你唯一一个垂直调用的.其他可能是非虚拟的,只需使用适当的默认值调用"主".