More importantly it can give multiple different classes the same type of operations. A (naive) way of supporting multiple types of printers could be done like this:
Code:
public class FilePrinter
{
public void PrintToFile();
}
public class NetworkPrinter
{
public PrintOverNetwork();
}
public void Print(object printer)
{
if(printer is FilePrinter)
{
var file_printer = printer as FilePrinter;
file_printer.PrintToFile();
}
else if(printer is NetworkPrinter)
{
var network_printer = printer as NetworkPrinter;
network_printer.PrintOverNetwork();
}
}
A better way would be to give them a common printing interface:
Code:
public interface IPrinter
{
void Print();
}
public class FilePrinter : IPrinter
{
public void PrintToFile();
public void Print() { PrintToFile(); }
}
public class NetworkPrinter : IPrinter
{
public PrintOverNetwork();
public void Print() { PrintOverNetwork(); }
}
public void Print(IPrinter printer)
{
printer.Print();
}
A cleaner solution, less cluttering if-elses and much easier to extend with more Printers later (maybe an USBPrinter?).