调用基函数,然后调用继承函数

2024-01-08

我有一个基类和一个继承基类的类。基类有几个虚函数,继承类可以重写这些虚函数。但是,基类中的虚拟函数具有必须在调用继承类重写之前运行的代码。有什么方法可以让我先调用基类虚函数,然后再调用继承的类重写。无需调用base.function()。

我知道我可以简单地创建两个函数,一个被调用,另一个是虚拟的。但有没有办法让我也能保留相同的名字呢?我知道我可能需要改变一些事情。

class myBase
{
    public virtual myFunction()
        { /* must-run code, Called first */ }
}

class myInherited : myBase
{
    public override myFunction()
        { /* don't use base.myFunction();,
        called from base.myFunction(); */ }
}

类似问题here https://stackoverflow.com/questions/2872137/does-this-keyword-exist-when-an-overriding-method-needs-to-call-the-parent/2872146#2872146.


C# 不支持自动强制执行此操作,但是 你可以通过使用来强制执行它模板方法模式 http://en.wikipedia.org/wiki/Template_method_pattern。例如,假设您有以下代码:

abstract class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("I'm an animal.");
    }
}

class Dog : Animal
{
    public override void Speak()
    {
        base.Speak();
        Console.WriteLine("I'm a dog.");
    }
}

这里的问题是任何继承自Animal需要打电话base.Speak();以确保执行基本行为。您可以通过采用以下(略有不同)方法自动强制执行此操作:

abstract class Animal
{
    public void Speak()
    {
        Console.WriteLine("I'm an animal.");
        DoSpeak();
    }

    protected abstract void DoSpeak();
}

class Dog : Animal
{
    protected override void DoSpeak()
    {
        Console.WriteLine("I'm a dog.");
    }
}

在这种情况下,客户端仍然只能看到多态Speak方法,但是Animal.Speak行为保证执行。问题是,如果您有进一步的继承(例如class Dachshund : Dog),如果你想要的话,你必须创建另一个抽象方法Dog.Speak才能保证执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用基函数,然后调用继承函数 的相关文章

随机推荐