Interface-typed collections can call different implementations through one type.

interface polymorphism Interface polymorphism dispatches to the actual object's implementation.

Interface Polymorphism

word
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}");
    }
}
  1. 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) = "";
  2. foreach (IFormatter formatter in formatters)

    pass 1 of 2
    32foreach (IFormatter formatterUpperFormatter in formattersIFormatter[])33{34    if (summary.Length > 0)35    {36        summary += ",";37    }3839    summary += formatterUpperFormatter.Format(wordok);40}
  3. public string Format(string value)

    9{10    public string Format(string valueok)11    {12        return valueok.ToUpper();13    }
  4. summary ← OK

    39    summary→ OK += formatterUpperFormatter.Format(wordok);40}
  5. foreach (IFormatter formatter in formatters)

    pass 2 of 2
    32foreach (IFormatter formatterBracketFormatter in formattersIFormatter[])33{34    if (summary.Length > 0)
  6. summary ← OK,

    33{34    if (summary.Length2 > 0)35    {36        summary→ OK, += ",";37    }
  7. summary += formatter.Format(word);

    39    summary += formatterBracketFormatter.Format(wordok);40}
  8. public string Format(string value)

    17{18    public string Format(string valueok)19    {20        return "[" + valueok + "]";21    }
  9. summary ← OK,[ok]

    39    summary→ OK,[ok] += formatterBracketFormatter.Format(wordok);40}
  10. Console.WriteLine($"word={word}");

    42    Console.WriteLine($"word={wordok}");43    Console.WriteLine($"summary={summaryOK,[ok]}");44}
    outputword=ok
    summary=OK,[ok]
  1. 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) = "";
  2. foreach (IFormatter formatter in formatters)

    pass 1 of 2
    32foreach (IFormatter formatterUpperFormatter in formattersIFormatter[])33{34    if (summary.Length > 0)35    {36        summary += ",";37    }3839    summary += formatterUpperFormatter.Format(wordgo);40}
  3. public string Format(string value)

    9{10    public string Format(string valuego)11    {12        return valuego.ToUpper();13    }
  4. summary ← GO

    39    summary→ GO += formatterUpperFormatter.Format(wordgo);40}
  5. foreach (IFormatter formatter in formatters)

    pass 2 of 2
    32foreach (IFormatter formatterBracketFormatter in formattersIFormatter[])33{34    if (summary.Length > 0)
  6. summary ← GO,

    33{34    if (summary.Length2 > 0)35    {36        summary→ GO, += ",";37    }
  7. summary += formatter.Format(word);

    39    summary += formatterBracketFormatter.Format(wordgo);40}
  8. public string Format(string value)

    17{18    public string Format(string valuego)19    {20        return "[" + valuego + "]";21    }
  9. summary ← GO,[go]

    39    summary→ GO,[go] += formatterBracketFormatter.Format(wordgo);40}
  10. Console.WriteLine($"word={word}");

    42    Console.WriteLine($"word={wordgo}");43    Console.WriteLine($"summary={summaryGO,[go]}");44}
    outputword=go
    summary=GO,[go]
  1. 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) = "";
  2. foreach (IFormatter formatter in formatters)

    pass 1 of 2
    32foreach (IFormatter formatterUpperFormatter in formattersIFormatter[])33{34    if (summary.Length > 0)35    {36        summary += ",";37    }3839    summary += formatterUpperFormatter.Format(wordyes);40}
  3. public string Format(string value)

    9{10    public string Format(string valueyes)11    {12        return valueyes.ToUpper();13    }
  4. summary ← YES

    39    summary→ YES += formatterUpperFormatter.Format(wordyes);40}
  5. foreach (IFormatter formatter in formatters)

    pass 2 of 2
    32foreach (IFormatter formatterBracketFormatter in formattersIFormatter[])33{34    if (summary.Length > 0)
  6. summary ← YES,

    33{34    if (summary.Length3 > 0)35    {36        summary→ YES, += ",";37    }
  7. summary += formatter.Format(word);

    39    summary += formatterBracketFormatter.Format(wordyes);40}
  8. public string Format(string value)

    17{18    public string Format(string valueyes)19    {20        return "[" + valueyes + "]";21    }
  9. summary ← YES,[yes]

    39    summary→ YES,[yes] += formatterBracketFormatter.Format(wordyes);40}
  10. Console.WriteLine($"word={word}");

    42    Console.WriteLine($"word={wordyes}");43    Console.WriteLine($"summary={summaryYES,[yes]}");44}
    outputword=yes
    summary=YES,[yes]