调用重写方法时如何强制执行方法调用(在基类中)?

Jef*_*eff 7 c# inheritance overriding method-call

我有这种情况,当从ImplementClass调用AbstractMethod方法时,我想强制调用AbstractClass中的MustBeCalled方法.我以前从未遇到过这种情况.谢谢!

public abstract class AbstractClass
{
    public abstract void AbstractMethod();

    public void MustBeCalled()
    {
        //this must be called when AbstractMethod is invoked
    }
}

public class ImplementClass : AbstractClass
{
    public override void AbstractMethod()
    {
        //when called, base.MustBeCalled() must be called.
        //how can i enforce this?
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 8

一个选项是让Abstract类以这种方式进行调用.否则,c#中没有办法要求继承的类以某种方式实现方法.

public abstract class AbstractClass
{
    public void PerformThisFunction()
    {
        MustBeCalled();
        AbstractMethod();
    }

    public void MustBeCalled()
    {
        //this must be called when AbstractMethod is invoked
    }

    //could also be public if desired
    protected abstract void AbstractMethod();
}

public class ImplementClass : AbstractClass
{
    protected override void AbstractMethod()
    {
        //when called, base.MustBeCalled() must be called.
        //how can i enforce this?
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做会在抽象类中创建所需的面向公众的方法,为抽象类提供调用事物的方式和顺序,同时仍允许具体类提供所需的功能.


Sim*_*son 6

怎么样

public abstract class AbstractClass
{
    public void AbstractMethod()
    {
        MustBeCalled();
        InternalAbstractMethod();
    }

    protected abstract void InternalAbstractMethod();

    public void MustBeCalled()
    {
        //this must be called when AbstractMethod is invoked
    }
}

public class ImplementClass : AbstractClass
{
    protected override void InternalAbstractMethod()
    {
        //when called, base.MustBeCalled() must be called.
        //how can i enforce this?
    }
}
Run Code Online (Sandbox Code Playgroud)