博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
23,理解接口方法和虚方法的区别
阅读量:5060 次
发布时间:2019-06-12

本文共 2035 字,大约阅读时间需要 6 分钟。

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

你可能感兴趣的文章
src与href的区别
查看>>
ABAP工作区,内表,标题行的定义和区别
查看>>
《xxx重大需求征集系统的》可用性和可修改性战术分析
查看>>
Python 中 创建类方法为什么要加self
查看>>
关于indexOf的使用
查看>>
【转】JS生成 UUID的四种方法
查看>>
英语单词
查看>>
centos6.8下安装matlab2009(图片转帖)
查看>>
Mongo自动备份
查看>>
求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
查看>>
VMWARE虚拟机无法访问的三种方法分析
查看>>
enq: SQ - contention
查看>>
cer证书签名验证
查看>>
ant 安装
查看>>
新手Python第一天(接触)
查看>>
vue路由动态加载
查看>>
【原】UIWebView加载本地pdf、doc等文件
查看>>
iOS中ARC内部原理
查看>>
【bzoj1029】[JSOI2007]建筑抢修
查看>>
synchronized
查看>>