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!" );
}
}
是否可以只覆盖该方法的一部分?
不,这是不可能的。您需要将函数中需要重写的部分提取到新的virtual
方法中。
例如,如果仅从该方法调用AdjustWorldObject
和ResetWorldObject
,则可以使它们成为虚拟的,并在需要时进行覆盖,如
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();
}
}
如果不是,则可以创建类似的专用虚拟方法。