| // We have added M2 to class A.
// In addtion, M1 now calls M2.
// Does not compile.
using System;
// New version of A
class A {
public void M1(){
Console.WriteLine("Method 1");
this.M2();
}
// New method in this version.
// Same name as the dangerous operation in subclass B
public void M2(){
Console.WriteLine("M2 in new version of A");
}
}
class B: A {
// Compile-time error in C#:
// 'B.M2()' hides inherited member 'A.M2()'.
// Use the new keyword if hiding was intended.
public void M2(){
Console.WriteLine("Dangerous Method 2");
}
}
class Client{
public static void Main(){
A a = new B();
B b = new B();
a.M1(); // Nothing dangerous expected.
// Will, however, call the dangerous operation
// if M2 is regarded as virtual.
a.M2(); // Makes sense when M2 exists in class A.
// Dangerous
b.M2(); // Expects dangerous operation
}
} |