C#-只重写函数的一部分

本文关键字:一部分 函数 重写 C#- | 更新日期: 2023-09-27 18:25:06

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

我正在努力实现的目标

Party class负责检测回合制的战斗属性。此外,每个政党都有成员(实体)和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!" );
    }
}

C#-只重写函数的一部分

是否可以只覆盖该方法的一部分?

不,这是不可能的。您需要将函数中需要重写的部分提取到新的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();
    }
}

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