我有一个基类和一个继承基类的类。基类有几个虚函数,继承类可以重写这些虚函数。但是,基类中的虚拟函数具有必须在调用继承类重写之前运行的代码。有什么方法可以让我先调用基类虚函数,然后再调用继承的类重写。无需调用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(使用前将#替换为@)