Interfaces and Abstractions
Interface Polymorphism
Interface-typed collections can call different implementations through one type.
interface polymorphism
Interface polymorphism dispatches to the actual object's implementation.
Interface Polymorphism
InterfacePolymorphism.cs
Replay: real traced execution (multi-file project)
using System;
interface IFormatter
{
string Format(string value);
}
class UpperFormatter : IFormatter
{
public string Format(string value)
{
return value.ToUpper();
}
}
class BracketFormatter : IFormatter
{
public string Format(string value)
{
return "[" + value + "]";
}
}
class Program
{
static void Main()
{
string word = "ok";
IFormatter[] formatters = { new UpperFormatter(), new BracketFormatter() };
string summary = "";
foreach (IFormatter formatter in formatters)
{
if (summary.Length > 0)
{
summary += ",";
}
summary += formatter.Format(word);
}
Console.WriteLine($"word={word}");
Console.WriteLine($"summary={summary}");
}
}
using System;
interface IFormatter
{
string Format(string value);
}
class UpperFormatter : IFormatter
{
public string Format(string value)
{
return value.ToUpper();
}
}
class BracketFormatter : IFormatter
{
public string Format(string value)
{
return "[" + value + "]";
}
}
class Program
{
static void Main()
{
string word = "go";
IFormatter[] formatters = { new UpperFormatter(), new BracketFormatter() };
string summary = "";
foreach (IFormatter formatter in formatters)
{
if (summary.Length > 0)
{
summary += ",";
}
summary += formatter.Format(word);
}
Console.WriteLine($"word={word}");
Console.WriteLine($"summary={summary}");
}
}
using System;
interface IFormatter
{
string Format(string value);
}
class UpperFormatter : IFormatter
{
public string Format(string value)
{
return value.ToUpper();
}
}
class BracketFormatter : IFormatter
{
public string Format(string value)
{
return "[" + value + "]";
}
}
class Program
{
static void Main()
{
string word = "yes";
IFormatter[] formatters = { new UpperFormatter(), new BracketFormatter() };
string summary = "";
foreach (IFormatter formatter in formatters)
{
if (summary.Length > 0)
{
summary += ",";
}
summary += formatter.Format(word);
}
Console.WriteLine($"word={word}");
Console.WriteLine($"summary={summary}");
}
}
word ← ok, formatters ← IFormatter[], summary ← (empty)
25{26 static void Main()27 {28 string word→ ok = "ok"; //@word="go", "yes"29 IFormatter[] formatters→ IFormatter[] = { new UpperFormatter(), new BracketFormatter() };30 string summary→ (empty) = "";foreach (IFormatter formatter in formatters)
pass 1 of 232foreach (IFormatter formatterUpperFormatter in formattersIFormatter[])33{34 if (summary.Length > 0)35 {36 summary += ",";37 }3839 summary += formatterUpperFormatter.Format(wordok);40}public string Format(string value)
9{10 public string Format(string valueok)11 {12 return valueok.ToUpper();13 }summary ← OK
39 summary→ OK += formatterUpperFormatter.Format(wordok);40}foreach (IFormatter formatter in formatters)
pass 2 of 232foreach (IFormatter formatterBracketFormatter in formattersIFormatter[])33{34 if (summary.Length > 0)summary ← OK,
33{34 if (summary.Length2 > 0)35 {36 summary→ OK, += ",";37 }summary += formatter.Format(word);
39 summary += formatterBracketFormatter.Format(wordok);40}public string Format(string value)
17{18 public string Format(string valueok)19 {20 return "[" + valueok + "]";21 }summary ← OK,[ok]
39 summary→ OK,[ok] += formatterBracketFormatter.Format(wordok);40}Console.WriteLine($"word={word}");
42 Console.WriteLine($"word={wordok}");43 Console.WriteLine($"summary={summaryOK,[ok]}");44}outputword=ok summary=OK,[ok]
word ← go, formatters ← IFormatter[], summary ← (empty)
25{26 static void Main()27 {28 string word→ go = "go";29 IFormatter[] formatters→ IFormatter[] = { new UpperFormatter(), new BracketFormatter() };30 string summary→ (empty) = "";foreach (IFormatter formatter in formatters)
pass 1 of 232foreach (IFormatter formatterUpperFormatter in formattersIFormatter[])33{34 if (summary.Length > 0)35 {36 summary += ",";37 }3839 summary += formatterUpperFormatter.Format(wordgo);40}public string Format(string value)
9{10 public string Format(string valuego)11 {12 return valuego.ToUpper();13 }summary ← GO
39 summary→ GO += formatterUpperFormatter.Format(wordgo);40}foreach (IFormatter formatter in formatters)
pass 2 of 232foreach (IFormatter formatterBracketFormatter in formattersIFormatter[])33{34 if (summary.Length > 0)summary ← GO,
33{34 if (summary.Length2 > 0)35 {36 summary→ GO, += ",";37 }summary += formatter.Format(word);
39 summary += formatterBracketFormatter.Format(wordgo);40}public string Format(string value)
17{18 public string Format(string valuego)19 {20 return "[" + valuego + "]";21 }summary ← GO,[go]
39 summary→ GO,[go] += formatterBracketFormatter.Format(wordgo);40}Console.WriteLine($"word={word}");
42 Console.WriteLine($"word={wordgo}");43 Console.WriteLine($"summary={summaryGO,[go]}");44}outputword=go summary=GO,[go]
word ← yes, formatters ← IFormatter[], summary ← (empty)
25{26 static void Main()27 {28 string word→ yes = "yes";29 IFormatter[] formatters→ IFormatter[] = { new UpperFormatter(), new BracketFormatter() };30 string summary→ (empty) = "";foreach (IFormatter formatter in formatters)
pass 1 of 232foreach (IFormatter formatterUpperFormatter in formattersIFormatter[])33{34 if (summary.Length > 0)35 {36 summary += ",";37 }3839 summary += formatterUpperFormatter.Format(wordyes);40}public string Format(string value)
9{10 public string Format(string valueyes)11 {12 return valueyes.ToUpper();13 }summary ← YES
39 summary→ YES += formatterUpperFormatter.Format(wordyes);40}foreach (IFormatter formatter in formatters)
pass 2 of 232foreach (IFormatter formatterBracketFormatter in formattersIFormatter[])33{34 if (summary.Length > 0)summary ← YES,
33{34 if (summary.Length3 > 0)35 {36 summary→ YES, += ",";37 }summary += formatter.Format(word);
39 summary += formatterBracketFormatter.Format(wordyes);40}public string Format(string value)
17{18 public string Format(string valueyes)19 {20 return "[" + valueyes + "]";21 }summary ← YES,[yes]
39 summary→ YES,[yes] += formatterBracketFormatter.Format(wordyes);40}Console.WriteLine($"word={word}");
42 Console.WriteLine($"word={wordyes}");43 Console.WriteLine($"summary={summaryYES,[yes]}");44}outputword=yes summary=YES,[yes]