C# 自动调用基方法

C# 自动调用基方法,c#,inheritance,C#,Inheritance,我需要在调用重写的方法时自动调用基类方法(就像构造函数调用base一样)。例如: class A { public void Fun() { Console.Write("Class A!"); } } class B : A { public void Fun() { Console.Write("Class B!"); } } 我想在屏幕上看到 甲级!B班 执行下一个代码时: B b = new B(); b

我需要在调用重写的方法时自动调用基类方法(就像构造函数调用base一样)。例如:

class A
{
    public void Fun()
    {
        Console.Write("Class A!");
    }
}

class B : A
{
    public void Fun()
    {
        Console.Write("Class B!");
    }
}
我想在屏幕上看到

甲级!B班

执行下一个代码时:

B b = new B();
b.Fun();

谁能告诉我示例代码中需要更改什么,或者如何更好地编写以获得所需的结果?谢谢。

如果您想要这种行为,您需要更改平台/语言。NET不会自动调用基方法。您需要显式地调用它。此外,您的方法需要是或将隐藏在派生类中:

class A
{
    public virtual void Fun()
    {
        Console.Write("Class A!");
    }
}

class B : A
{
    public override void Fun()
    {
        // call the base method which will print Class A!
        base.Fun(); 
        Console.Write("Class B!");
    }
}
现在,当您执行此操作时:

B b = new B();
b.Fun();

您将获得所需的结果。

如果您不想显式调用它,因此确保在派生类中调用了
A.Fun()
,则可以使用名为:

这将给你:

new A().Fun() -> "Class A!"
new B().Fun() -> "Class A! Class B!"
仍然可以这样:

interface IFun
{
    void Fun();
}

abstract class A : IFun
{
    void IFun.Fun()
    {
        Console.Write("Class A!");
        Fun();
    }
    protected abstract void Fun();
}

class B : A
{
    protected override void Fun()
    {
        Console.Write("Class B!");
    }
}

IFun b = new B();
b.Fun();

如果对象引用是IFun,这就可以工作。

仅作为参考,您可以使用一个包装器模式,将a放入B中。下面是一个粗略的示例


没有理由这么复杂。只需显式调用父类的方法:

class A {
    public void Fun() {
        Console.Write("Class A!");
    }
}

class B : A {
    public void Fun() {
        base.Fun();
        Console.Write("Class B!");
    }
}

class Program {
    static void Main(string[] args) {

        (new B()).Fun();

    }
}

“您的方法还需要是虚拟的,或者您将在派生类中隐藏它”对于poster想要的行为,我不确定它是否需要是虚拟的。@strager,如果它不是虚拟的,您将得到一个编译器警告。您可以在不使用虚拟方法的情况下使用new关键字来消除警告。@BurningIce,正确,这可能是你应该做的@Darin Dimitrov,期望的行为和虚拟方法是正交的;虚拟方法与此问题无关。@Kirkham感谢您纠正我的拼写并澄清我的答案:),但我不能以这种方式创建类的实例。而且已经给出了很好的答案。它与我在问题的第一句中提出的问题正好相反。请通过编辑对您的答案添加一些解释,以便其他人可以从中学习
interface IFunClass {
    void Fun();
}

class A : IFunClass {
    public void IFunClass.Fun() {
        Console.Write("Class A!");
    }
}

class B : IFunClass {
    public B(IFunClass f) {
        this.m_SomethingFun = f;
    }

    public void IFunClass.Fun() {

        this.m_SomethingFun.Fun();

        Console.Write("Class B!");
    }

    private IFunClass m_SomethingFun;
}

A a = new A();
B b = new B(a);

b.Fun() // will call a.Fun() first inside b.Fun()
class A {
    public void Fun() {
        Console.Write("Class A!");
    }
}

class B : A {
    public void Fun() {
        base.Fun();
        Console.Write("Class B!");
    }
}

class Program {
    static void Main(string[] args) {

        (new B()).Fun();

    }
}