Возможно ли совместить update абстрактного класса с наследником?
У меня есть несколько классов врагов, которые наследуются от абстрактного класса. Мне нужно в Update у каждого класса писать _currentFramesInvulnerability -= Time.deltaTime;
. Возможно ли указать это в абстрактном классе, если в наследуемых классах врагов в update есть еще другие строки кода? Сначала я подумал про override, но если я правильно понимаю, то тогда эта строка не будет выполняться.
Ответы (2 шт):
Делается просто: добавляется абстрактный метод, например AdditionalUpdateOp
, который все наследники должны реализовать. А в методе Update
абстрактного класса пишется:
_currentFramesInvulnerability -= Time.deltaTime;
AdditionalUpdateOp();
Собственно всё. В наследниках просто реализуется метод AdditionalUpdateOp
никак не трогая никогда Update
.
public abstract class Enemy : MonoBehaviour
{
private float _currentFramesInvulnerability;
protected virtual Update ()
{
_currentFramesInvulnerability -= Time.deltaTime;
}
}
public class Goblin : Enemy
{
protected override Update ()
{
base.Update(); // вызов метода Update класса, от которого наследуется текущий
// Do some
}
}
Но это плохая практика, если код virtual
метода должен быть обязательно исполнен, необходимо следовать своему же контракту явным образом.
public abstract class Enemy : MonoBehaviour
{
private float _currentFramesInvulnerability;
private Update ()
{
_currentFramesInvulnerability -= Time.deltaTime;
OnFrameTick();
}
protected abstract OnFrameTick ();
}
public class Goblin : Enemy
{
protected override OnFrameTick ()
{
// Do some
}
}