View Code
interface IMsg { void Message(); }
View Code
public class MyClass : IMsg { public void Message() { Console.WriteLine("MyClass"); } }
上面的定义可以看到Message()方法是MyClass公有接口的一部分。Message()也可以通过IMsg来访问。但是如果在对MyClass添加一个派生类,在C#编译器中就会提醒你有有些不对了,虽然不是错误
View Code
public class MyDerivedClass : MyClass { new public void Message() { Console.WriteLine("MyDerivedClass"); } }
定义完上面的方法,vs会提示你应该添加一个new关键字,因为MyClass.Message()并不是一个虚方法.所以其派生类不能重写,只是覆盖,也就是把父类的Message()方法隐藏了.MyDerived类实际上创建了一个 新的Message()方法,和父类的Message()方法并不构成重写关系,但是,父类的方法依旧有办法访问到的
View Code
static void Main(string[] args) { MyDerivedClass mdc = new MyDerivedClass(); mdc.Message(); //prints "MyDerivedClass" IMsg m = mdc as IMsg; m.Message();//prints "MyClass" }
接口方法并不是虚方法,在实现接口时,实际上是在类型中给出某个特定接口契约的具体实现
为了避免这个问题,我们要在派生类中重新实现接口:
View Code
public class MyDerivedClass : MyClass,IMsg { public new void Message() { Console.WriteLine("MyDerivedClass"); } }
这时的测试代码就会出现不同的状况了:
View Code
但似乎这样还是存在一些问题的,(以为真的就访问不到基类的message()了么?)还是可以: MyDerivedClass mdc = new MyDerivedClass(); mdc.Message(); //prints "MyDerivedClass" IMsg m = mdc as IMsg; m.Message(); //prints "MyDerivedClass"
View Code
MyDerivedClass mdc = new MyDerivedClass(); mdc.Message(); // prints "MyDerivedClass" IMsg m = mdc as IMsg; m.Message(); // prints "MyDerivedClass" MyClass mc = m as MyClass; mc.Message(); // prints "MyClass"
......
崩溃了把。。要解决,就要修改基类,把接口方法声明为虚方法
View Code
public class MyClass : IMsg { public virtual void Message() { Console.WriteLine("MyClass"); } } public class MyDerivedClass : MyClass,IMsg { public override void Message() { Console.WriteLine("MyDerivedClass"); } }