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

 

转载于:https://www.cnblogs.com/missmore/archive/2012/12/02/2798055.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值