如何在C#中隐藏基类的私有方法?

时间:2019-05-08 18:58:27

标签: c# inheritance polymorphism encapsulation method-hiding

我没有找到问题的答案,但这似乎很简单。主要的大问题是,我购买了一些库并在dll中进行了硬编码,而没有源代码,我无法重新编译该dll。这是学校级别的问题:

我们有2个A类和B类

class A {
    public void Method1() {
        this.Method2 ();
    }

    private void Method2() {
        WriteLine  ("A");
    }
}

class B : A {
    private void Method2() {
        WriteLine ("B");
   }
}

如果我们调用“ new B()。Method1()”,那么我们就有字符串行“ A”。 我们不能对类A做任何事情,但是可以更改类B。我们应该获取字符串“ B”。

我尝试使用'new'修饰符,但是如您所知,它没有帮助。答案不是“也要覆盖Method1”,因为实际代码要大得多。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在我看来,您正在尝试覆盖Method2以使Method1打印“ B”。但是,由于Method2在A类中是私有且非虚拟的,因此按照C#的语言定义,这是不可能

如果我们可以妥协找到其他方法来达到您的预期效果,请参考以下建议。

作为修改后的样板的类组成:

class B
{
    private A;
    public void Method1() {
        this.Method2 ();
    }
    private void Method2() {
        WriteLine("B");
    }
    public void KeptMethod() {
        a.KeptMethod();
    }
}

呼叫/修改私人成员的反思:

typeof(A).GetField("privateValue", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(a, "injected string");
typeof(A).GetMethod("privateMethod", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(a, new object[0]);

我知道这两者都有缺点和局限性,但是由于我不知道您的实际目标,因此我发现很难更具体。