A method can depend on an interface instead of one concrete class.

Dependency Inversion

DependencyInversion.cs
using System;

interface IRatePlan
{
    int Cost(int units);
}

class BasicPlan : IRatePlan
{
    public int Cost(int units)
    {
        return units * 2;
    }
}

class PremiumPlan : IRatePlan
{
    public int Cost(int units)
    {
        return units * 3;
    }
}

class Invoice
{
    public int Total(IRatePlan plan, int units)
    {
        return plan.Cost(units);
    }
}

class Program
{
    static void Main()
    {
        int units = ;
        Invoice invoice = new Invoice();
        IRatePlan plan = new PremiumPlan();
        int total = invoice.Total(plan, units);

        Console.WriteLine($"units={units}");
        Console.WriteLine($"total={total}");
    }
}
using System;

interface IRatePlan
{
    int Cost(int units);
}

class BasicPlan : IRatePlan
{
    public int Cost(int units)
    {
        return units * 2;
    }
}

class PremiumPlan : IRatePlan
{
    public int Cost(int units)
    {
        return units * 3;
    }
}

class Invoice
{
    public int Total(IRatePlan plan, int units)
    {
        return plan.Cost(units);
    }
}

class Program
{
    static void Main()
    {
        int units = ;
        Invoice invoice = new Invoice();
        IRatePlan plan = new PremiumPlan();
        int total = invoice.Total(plan, units);

        Console.WriteLine($"units={units}");
        Console.WriteLine($"total={total}");
    }
}
using System;

interface IRatePlan
{
    int Cost(int units);
}

class BasicPlan : IRatePlan
{
    public int Cost(int units)
    {
        return units * 2;
    }
}

class PremiumPlan : IRatePlan
{
    public int Cost(int units)
    {
        return units * 3;
    }
}

class Invoice
{
    public int Total(IRatePlan plan, int units)
    {
        return plan.Cost(units);
    }
}

class Program
{
    static void Main()
    {
        int units = ;
        Invoice invoice = new Invoice();
        IRatePlan plan = new PremiumPlan();
        int total = invoice.Total(plan, units);

        Console.WriteLine($"units={units}");
        Console.WriteLine($"total={total}");
    }
}
dependency inversion Dependency inversion passes behavior through an abstraction.