a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
64 lines
1.5 KiB
C#
64 lines
1.5 KiB
C#
// Some interfaces, one is a superset of the other
|
|
public interface Node
|
|
{
|
|
int GetStat();
|
|
}
|
|
public interface FileNode : Node
|
|
{
|
|
int NotUsed();
|
|
}
|
|
|
|
// Some basic implementations, one is a superset of the other
|
|
public class GenericNode : Node
|
|
{
|
|
public virtual int GetStat() { return 0; }
|
|
}
|
|
|
|
public class GenericFileNode : GenericNode , FileNode
|
|
{
|
|
public virtual int NotUsed() { return -1; }
|
|
}
|
|
|
|
|
|
// Now the ability to override a method depends on if we specify again that we
|
|
// implement an interface -- although we must because we derive from a class
|
|
// that does.
|
|
public class WorkingTest : GenericFileNode , FileNode
|
|
{
|
|
public override int GetStat() { return 42; }
|
|
}
|
|
|
|
public class FailingTest : GenericFileNode
|
|
{
|
|
// This never gets called, but it builds, so what did we override?!!!
|
|
public override int GetStat() { return 42; }
|
|
}
|
|
|
|
public class TestWrapper
|
|
{
|
|
static bool Test(Node inst, string name)
|
|
{
|
|
if(inst.GetStat() == 42)
|
|
{
|
|
System.Console.WriteLine("{0} -- Passed", name);
|
|
return true;
|
|
} else
|
|
{
|
|
System.Console.WriteLine("{0} -- FAILED", name);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static int Main()
|
|
{
|
|
if( Test(new WorkingTest(), "WorkingTest")
|
|
&& Test(new FailingTest(), "FailingTest") )
|
|
return 0; // everything worked
|
|
else
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|