Inheritance and Polymorphism
Base Method Calls
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
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}");
}
}
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();this.level ← high
15public PriorityTicket(string levelhigh)16{17 this.level→ high = levelhigh;18}ticket ← PriorityTicket
30string level = "high"; //@level="low", "urgent"31PriorityTicket ticket→ PriorityTicket = new PriorityTicket(level);32string formatted = ticketPriorityTicket.Format();public override string Format()
20public override string Format()21{22 return base.Format() + ":" + levelhigh;23}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
level ← low
27{28 static void Main()29 {30 string level→ low = "low";31 PriorityTicket ticket = new PriorityTicket(level);32 string formatted = ticket.Format();this.level ← low
15public PriorityTicket(string levellow)16{17 this.level→ low = levellow;18}ticket ← PriorityTicket
30string level = "low";31PriorityTicket ticket→ PriorityTicket = new PriorityTicket(level);32string formatted = ticketPriorityTicket.Format();public override string Format()
20public override string Format()21{22 return base.Format() + ":" + levellow;23}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
level ← urgent
27{28 static void Main()29 {30 string level→ urgent = "urgent";31 PriorityTicket ticket = new PriorityTicket(level);32 string formatted = ticket.Format();this.level ← urgent
15public PriorityTicket(string levelurgent)16{17 this.level→ urgent = levelurgent;18}ticket ← PriorityTicket
30string level = "urgent";31PriorityTicket ticket→ PriorityTicket = new PriorityTicket(level);32string formatted = ticketPriorityTicket.Format();public override string Format()
20public override string Format()21{22 return base.Format() + ":" + levelurgent;23}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