自动调用基本方法

时间:2010-11-07 17:56:49

标签: c# inheritance

我需要在调用override一个时自动调用基类方法(比如构造函数调用base)。例如:

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

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

我想在屏幕上看到

  

A级! B级!

执行下一个代码时:

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

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

5 个答案:

答案 0 :(得分:20)

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

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

    protected virtual void FunProtected()
    {
    }
}

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

这会给你:

new A().Fun() -> "Class A!"
new B().Fun() -> "Class A! Class B!"

答案 1 :(得分:8)

如果您需要此类行为,则需要更改平台/语言。 .NET不会自动调用基本方法。你需要明确地调用它。您的方法也需要virtual,否则您将隐藏在派生类中:

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();

您将获得所需的结果。

答案 2 :(得分:2)

仍然可以这样:

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,则此方法有效。

答案 3 :(得分:0)

仅供参考,您可以使用将A放在B中的包装模式。这是一个原始示例!

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()

答案 4 :(得分:-2)

没有理由很复杂。只需显式调用父类的方法即可:

if (requestCode == PICK_IMAGE) {
   if(resultCode==Activity.RESULT_OK){
     Uri file = data.getData(); // you can find path also from here
      ImageView.setImageURI(file)
     }