public interface IPrint {
public interface IPrintHigher {
public abstract class PrintBase : IPrint
public virtual void Print(){
Console.WriteLine("Base");
public class OverridePrint : PrintBase, IPrintHigher
public override void Print(){
Console.WriteLine("Overridden");
public class NewPrint : PrintBase, IPrintHigher
Console.WriteLine("New");
public static void Main()
var overridePrint = new OverridePrint();
var newPrint = new NewPrint();
RunPrintInterface(overridePrint);
RunPrintInterface(newPrint);
RunPrintHigherInterface(overridePrint);
RunPrintHigherInterface(newPrint);
public static void RunPrint(PrintBase print){
public static void RunPrintInterface(IPrint print){
public static void RunPrintHigherInterface(IPrintHigher print){