Virtual, override

När man vill kunna låta en subklass ha en egen version av en metod som finns i basklassen så använder man virtual och override.

Virtual används för att markera metoder i basklassen som får "skrivas över" av subklasserna.

Character.cs
class Character
{
  protected int _hp = 100;
  protected int _damage = 5;
  
  public int Attack()
  {
    return Random.Shared.Next(_damage);
  }

  public virtual void Hurt(int amount)
  {
    _hp -= amount;
  }
}

Override används för att ge en subklass en egen version av en metod från basklassen som markerats som virtuell.

Berbarian.cs
class Barbarian: Character
{
  public override void Hurt(int amount)
  {
    _hp -= amount / 2;
  }
}

För att Override ska fungera så måste det finnas en metod i basklassen som ser likadan ut (samma namn, samma returtyp, samma antal parametrar med samma datatyper) och som är virtual.

Syftet med detta är att göra så att man inte måste skapa nya metoder åt subklasserna när de ska fungera annorlunda än basklassen. Det här är en av byggstenarna för polymorfism.

Base

Base låter en subklass få tillgång till basklassens version av en metod.

Character.cs
class Character
{
  protected int _hp = 100;
  protected int _damage = 5;

  public virtual int Attack()
  {
    return Random.Shared.Next(_damage);
  }

  public virtual void Hurt(int amount)
  {
    _hp -= amount;
  }
}
Fighter.cs
class Fighter
{
  public override int Attack()
  {
    return base.Attack() * 2;
  }
}

När en Fighter-instans' Attack-metod anropas i koden ovan, så anropas först basklassens Attack-metod, som returnerar 5. Den femman multipliceras med 2 och resultatet returneras. Med andra ord:

Fighter f = new Fighter();
int damage = f.Attack();

I exemplet ovan blir damage lika med 10.

Last updated