23,理解接口方法和虚方法的区别

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
            MyDerivedClass mdc = new MyDerivedClass();
            mdc.Message(); //prints "MyDerivedClass"
            IMsg m = mdc as IMsg;
            m.Message();  //prints "MyDerivedClass"


但似乎这样还是存在一些问题的,(以为真的就访问不到基类的message()了么?)还是可以:

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");
        }
    }

 

posted @ 2012-12-02 12:36  missmore  阅读(237)  评论(0)    收藏  举报