An override can call the base method and then add more behavior.

base call The `base` keyword calls a member from the base class.

Base Method Calls

level
BaseMethodCalls.cs
Replay: real traced execution (multi-file project)
using System;

class Ticket
{
    public virtual string Format()
    {
        return "ticket";
    }
}

class PriorityTicket : Ticket
{
    private readonly string level;

    public PriorityTicket(string level)
    {
        this.level = level;
    }

    public override string Format()
    {
        return base.Format() + ":" + level;
    }
}

class Program
{
    static void Main()
    {
        string level = "high";
        PriorityTicket ticket = new PriorityTicket(level);
        string formatted = ticket.Format();

        Console.WriteLine($"level={level}");
        Console.WriteLine($"formatted={formatted}");
    }
}
using System;

class Ticket
{
    public virtual string Format()
    {
        return "ticket";
    }
}

class PriorityTicket : Ticket
{
    private readonly string level;

    public PriorityTicket(string level)
    {
        this.level = level;
    }

    public override string Format()
    {
        return base.Format() + ":" + level;
    }
}

class Program
{
    static void Main()
    {
        string level = "low";
        PriorityTicket ticket = new PriorityTicket(level);
        string formatted = ticket.Format();

        Console.WriteLine($"level={level}");
        Console.WriteLine($"formatted={formatted}");
    }
}
using System;

class Ticket
{
    public virtual string Format()
    {
        return "ticket";
    }
}

class PriorityTicket : Ticket
{
    private readonly string level;

    public PriorityTicket(string level)
    {
        this.level = level;
    }

    public override string Format()
    {
        return base.Format() + ":" + level;
    }
}

class Program
{
    static void Main()
    {
        string level = "urgent";
        PriorityTicket ticket = new PriorityTicket(level);
        string formatted = ticket.Format();

        Console.WriteLine($"level={level}");
        Console.WriteLine($"formatted={formatted}");
    }
}
  1. level ← high

    27{28    static void Main()29    {30        string level→ high = "high"; //@level="low", "urgent"31        PriorityTicket ticket = new PriorityTicket(level);32        string formatted = ticket.Format();
  2. this.level ← high

    15public PriorityTicket(string levelhigh)16{17    this.level→ high = levelhigh;18}
  3. ticket ← PriorityTicket

    30string level = "high"; //@level="low", "urgent"31PriorityTicket ticket→ PriorityTicket = new PriorityTicket(level);32string formatted = ticketPriorityTicket.Format();
  4. public override string Format()

    20public override string Format()21{22    return base.Format() + ":" + levelhigh;23}
  5. formatted ← ticket:high

    31    PriorityTicket ticket = new PriorityTicket(level);32    string formatted→ ticket:high = ticketPriorityTicket.Format();3334    Console.WriteLine($"level={levelhigh}");35    Console.WriteLine($"formatted={formattedticket:high}");36}
    outputlevel=high
    formatted=ticket:high
  1. level ← low

    27{28    static void Main()29    {30        string level→ low = "low";31        PriorityTicket ticket = new PriorityTicket(level);32        string formatted = ticket.Format();
  2. this.level ← low

    15public PriorityTicket(string levellow)16{17    this.level→ low = levellow;18}
  3. ticket ← PriorityTicket

    30string level = "low";31PriorityTicket ticket→ PriorityTicket = new PriorityTicket(level);32string formatted = ticketPriorityTicket.Format();
  4. public override string Format()

    20public override string Format()21{22    return base.Format() + ":" + levellow;23}
  5. formatted ← ticket:low

    31    PriorityTicket ticket = new PriorityTicket(level);32    string formatted→ ticket:low = ticketPriorityTicket.Format();3334    Console.WriteLine($"level={levellow}");35    Console.WriteLine($"formatted={formattedticket:low}");36}
    outputlevel=low
    formatted=ticket:low
  1. level ← urgent

    27{28    static void Main()29    {30        string level→ urgent = "urgent";31        PriorityTicket ticket = new PriorityTicket(level);32        string formatted = ticket.Format();
  2. this.level ← urgent

    15public PriorityTicket(string levelurgent)16{17    this.level→ urgent = levelurgent;18}
  3. ticket ← PriorityTicket

    30string level = "urgent";31PriorityTicket ticket→ PriorityTicket = new PriorityTicket(level);32string formatted = ticketPriorityTicket.Format();
  4. public override string Format()

    20public override string Format()21{22    return base.Format() + ":" + levelurgent;23}
  5. formatted ← ticket:urgent

    31    PriorityTicket ticket = new PriorityTicket(level);32    string formatted→ ticket:urgent = ticketPriorityTicket.Format();3334    Console.WriteLine($"level={levelurgent}");35    Console.WriteLine($"formatted={formattedticket:urgent}");36}
    outputlevel=urgent
    formatted=ticket:urgent