C# - 仅覆盖部分功能

Sw3*_*das 0 c# inheritance

我有一个叫做Party函数的类,它被调用OnMemberDeath().我已经创建了一个名为PlayerParty继承的新类Party,现在我只需要向OnMemberDeath( )函数添加两个但非常重要的行(下面的示例).是否可以仅覆盖部分方法?

我正在努力实现的目标

派对类负责检测回合制战斗物.此外,每个缔约方都有成员(实体)和SelectionOrb(他们下面的小圈子).当一方成员去世时,必须选择新成员.通过成员选择过程,SelectionOrb必须接收新的父(AdjustWorldObject())以及必须分配对所选成员的引用(对于战斗内容).如果没有剩下活动成员,我们需要设置parent,null以便SelectionOrb不会与Member对象一起删除.
在PlayerParty类中有新对象,即CombatUI,它的作用与SelectionOrb基本相同(必须在当前死亡后接收新的父对象).希望这很清楚:).

    /** in Party class **/
protected void OnMemberDeath( )
{
    if( aliveCount > 1 )
    {
        AdjustWorldObject( );
        aliveCount--;
    }

    else
    {
        ResetWorldObject( );

        if( OnPartyDeath != null ) OnPartyDeath( ); // Event
        else print( "Party died but event had no subscriptions!" );
    }
}

    /** in PlayerParty class **/
new void OnMemberDeath( )
{
    if( aliveCount > 1 )
    {
        AdjustWorldObject( );
        AdjustCombatUI( ); // The first line I want to add
    }

    else
    {
        ResetWorldObject( );
        ResetCombatUI( ); // The second line I want to add

        if( OnPartyDeath != null ) OnPartyDeath( ); // Event
        else print( "Party died but event had no subscriptions!" );
    }
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

是否可以仅覆盖部分方法?

不,这是不可能的.您需要将需要重写的函数部分提取到新virtual方法中.

例如,如果您的AdjustWorldObjectResetWorldObject仅通过此方法调用,则可以将它们设置为虚拟并在需要时覆盖,如下所示

class Party
{
    protected void OnMemberDeath( )
    {
        if(aliveCount > 1)
        {
            AdjustWorldObject();
            aliveCount--;
        }
        else
        {
            ResetWorldObject();
            if(OnPartyDeath != null) OnPartyDeath(); // Event
            else print( "Party died but event had no subscriptions!" );
        }
    }
    protected virtual void AdjustWorldObject()
    {
        // ...
    }
    protected virtual void ResetWorldObject()
    {
        // ...
    }
}

class PlayerParty : Party
{
    protected override void AdjustWorldObject()
    {
        base.AdjustWorldObject();
        AdjustCombatUI();
    }
    protected override void ResetWorldObject()
    {
        base.ResetWorldObject();
        ResetCombatUI();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不是,您可以创建类似的专用虚拟方法.

  • @ Sw3das但是你可能会看到,只有当`aliveCount> 1`时才从基类调用`AdjustWorldObject()`虚方法,所以你的`AdjustCombatUI`也一样,不是吗? (2认同)