问题:
经常看到系统代码中有
ICollection从 IEnumerable派生
IList又从ICollection, IEnumerable派生
既然ICollection已经IEnumerable派生,为什么IList需要指出从IEnumerable派生?
如下代码,Person1和Person2的区别是Person2从IName继承,而Person1没有
这两种写法有什么不同?
经常看到系统代码中有
ICollection从 IEnumerable派生
IList又从ICollection, IEnumerable派生
既然ICollection已经IEnumerable派生,为什么IList需要指出从IEnumerable派生?
如下代码,Person1和Person2的区别是Person2从IName继承,而Person1没有
这两种写法有什么不同?
using System; namespace MyTest { interface IName { String GetName(); } interface IPerson: IName { String GetSex(); } class Person1 : IPerson { public String GetSex() { throw new NotImplementedException(); } public String GetName() { throw new NotImplementedException(); } } class Person2 : IPerson, IName { public String GetSex() { throw new NotImplementedException(); } public String GetName() { throw new NotImplementedException(); } } }
解决方案
40
现在问本人“接口能否支持继承”?本人觉得这放在不同场景下就会有不同回答。其实编译器“好心好意”,但是把问题复杂化了。
很显然,底层.net 并没有什么改变,仍然不支持接口继承。
但是c#编译器做出了“代码生成”方面的改变,硬要让一些程序员从一开始在脑子里就认为接口是支持继承的。本人相信vb.net 等语言的编译器肯定也同步实现了这个功能。
那么以后的 .net 底层到底是继续不支持接口继承,还是直接支持接口继承(从而现在编译出来的dll、.exe的汇编代码又变成含有多余的东西的代码了)呢?
原理是很清晰地,但是现实是光怪陆离的,要不断依据人们的需求而改变,并不能永远保证任何是非成败的判断。
很显然,底层.net 并没有什么改变,仍然不支持接口继承。
但是c#编译器做出了“代码生成”方面的改变,硬要让一些程序员从一开始在脑子里就认为接口是支持继承的。本人相信vb.net 等语言的编译器肯定也同步实现了这个功能。
那么以后的 .net 底层到底是继续不支持接口继承,还是直接支持接口继承(从而现在编译出来的dll、.exe的汇编代码又变成含有多余的东西的代码了)呢?
原理是很清晰地,但是现实是光怪陆离的,要不断依据人们的需求而改变,并不能永远保证任何是非成败的判断。