问题:
经常看到系统代码中有
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的汇编代码又变成含有多余的东西的代码了)呢?
原理是很清晰地,但是现实是光怪陆离的,要不断依据人们的需求而改变,并不能永远保证任何是非成败的判断。