调用基函数然后inheritance函数

我有一个基类和一个类inheritance基地。 基类有几个虚拟函数,inheritance类可能会覆盖。 但是,基类中的虚函数具有必须在inheritance类覆盖被调用之前运行的代码。 有什么方法可以先调用基类虚函数,然后inheritance类重写。 不需要调用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(); */ } } 

类似的问题在这里

可以在.NET Framework中find的常见解决scheme是在公用方法XXX和公用方法调用的受保护的虚拟方法OnXXX方法。 对于你的例子,它看起来像这样:

 class MyBase { public void MyMethod() { // do something OnMyMethod(); // do something } protected virtual void OnMyMethod() { } } 

 class MyInherited : MyBase { protected override void OnMyMethod() { // do something } } 

C#不支持自动执行此操作,但是您可以使用模板方法模式强制执行此操作。 例如,假设你有这样的代码:

 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."); } } 

这里的麻烦是,从Animalinheritance的任何类需要调用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行为是保证执行的。 问题是,如果你有进一步的inheritance(例如class Dachshund : Dog ),你必须创build另一个抽象的方法,如果你想Dog.Speak保证执行。

除了你已经提到的两种方法之外,没有办法去做你正在寻找的东西。

你可以在基类中创build2个函数,一个是被调用的,另一个是虚函数。

或者你在子类中调用base.functionName。

不完全是。 但是我用抽象方法做了类似的事情。

抽象方法必须被派生类重写。 抽象过程是虚拟的,所以你可以确定当基类调用派生类的版本时被调用。 然后让你的基类的“必须运行代码”在运行后调用抽象过程。 瞧,你的基类的代码总是先运行(确保基类过程不再是虚拟的),然后是派生类的代码。

 class myBase { public /* virtual */ myFunction() // remove virtual as we always want base class's function called here { /* must-run code, Called first */ // call derived object's code myDerivedMustcallFunction(); } public abstract myDerivedMustCallFunction() { /* abstract functions are blank */ } } class myInherited : myBase { public override myDerivedMustCallFunction() { /* code to be run in derived class here */ } } 

你觉得这怎么样?

 class myBase { public void myFunctionWrapper() { // do stuff that must happen first // then call overridden function this.myFunction(); } public virtual void myFunction(){ // default implementation that can be overriden } } class myInherited : myBase { public override void myFunction() { } }