Автоматически вызывать базовый метод - PullRequest
4 голосов
/ 07 ноября 2010

Мне нужно автоматически вызывать метод базового класса при вызове переопределенного метода (например, конструкторы вызывают базу).Например:

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

Может кто-нибудь сказать мне, пожалуйста, что нужно изменить в примере кода или как лучше написать, чтобы получить требуемый результат?Спасибо.

Ответы [ 4 ]

20 голосов
/ 07 ноября 2010

Если вы не хотите вызывать его явно и поэтому убедитесь, что в производном классе вызывается A.Fun(), вы можете использовать нечто, называемое шаблон метода шаблона :

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!"
8 голосов
/ 07 ноября 2010

Если вы хотите такое поведение, вам нужно изменить платформу / язык. .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 голосов
/ 20 мая 2011

Еще может быть так:

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.

0 голосов
/ 06 июля 2012

Просто для справки, вы можете использовать шаблон обертки, который помещает A внутри B. Вот пример raw !

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...