专著于富媒体技术~
本站某些作品来源于互联网,如果侵犯了您的利益,请留言说明!
本站某些作品来源于互联网,如果侵犯了您的利益,请留言说明!
1、当调用一个接口的函数时,系统会去检查这个接口对应实例是什么;
2、找到这个实例后,再去找这个实例对应的实例类是什么(实例类,在虚函数一文里曾说明过);
3、根据这个实例类去检查该实例类是否和接口发生了捆绑(看是否实现了该接口,冒号后面就是);
4、好!如果实例类实现了该接口(发生了捆绑),那么它就在这个实例类中找到接口中所申明的方法的定义,然后执行该方法,然后结束;
5、如果没找到,它就继续往父类去找,直到找到第一个和接口捆绑的父类为止;
6、找到后,它再检查这个父类里该方法是否是被定义为虚函数;
7、如果不是,他马上就执行这个方法,然后结束;
8、如果是,麻烦了,系统又要从头来过,去检查该最开始那个实例类里有否重载了父类里的这个虚函数……
例子:
interface I
{
void Func();
}
class A:I
{
public virtual void Func()
{
Console.WriteLine("Func In A");
}
}
//注意这里,用接口来实现类似多重继承的效果
class B:A,I
{
public void Func()
{
Console.WriteLine("Func In B");
}
}
class C:A
{
public override void Func()
{
Console.WriteLine("Func In C");
}
}
class D:A
{
public new void Func()
{
Console.WriteLine("Func In D");
}
}
public static void main()
{
I a = new A();
I b = new B();
I c = new C();
I d = new D();
//检查a的实例类A,发现A和接口I捆绑了,所以执行A的函数Func,结果: Func In A
a.Func();
//检查b的实例类B,发现B和接口I捆绑了,所以执行B的函数Func(而不会去执行父类A的,尽管A也
//实现I接口),结果: Func In B
b.Func();
//检查c的实例类C,发现其没有和接口I捆绑,系统继续找它的父类. 发现A和I捆绑了,他就去找
//函数A,发现A是虚拟函数,系统又从头来找类的实例C,发现C重载(override)了Func,好了,马
//上执行该函数. 结果是Func In C
c.Func();
//检查d的实例类D,发现其没有和接口I捆绑,系统继续找它的父类. 发现A和I捆绑了,他就去找
//函数A,发现A是虚拟函数,系统又从头来找类的实例D,但是D里没有重载(override)Func(而是
//用new覆盖了),所以又会到D的父类里找,所以还是执行A的Func(),结果是Func In A
d.Func();
}
{
void Func();
}
class A:I
{
public virtual void Func()
{
Console.WriteLine("Func In A");
}
}
//注意这里,用接口来实现类似多重继承的效果
class B:A,I
{
public void Func()
{
Console.WriteLine("Func In B");
}
}
class C:A
{
public override void Func()
{
Console.WriteLine("Func In C");
}
}
class D:A
{
public new void Func()
{
Console.WriteLine("Func In D");
}
}
public static void main()
{
I a = new A();
I b = new B();
I c = new C();
I d = new D();
//检查a的实例类A,发现A和接口I捆绑了,所以执行A的函数Func,结果: Func In A
a.Func();
//检查b的实例类B,发现B和接口I捆绑了,所以执行B的函数Func(而不会去执行父类A的,尽管A也
//实现I接口),结果: Func In B
b.Func();
//检查c的实例类C,发现其没有和接口I捆绑,系统继续找它的父类. 发现A和I捆绑了,他就去找
//函数A,发现A是虚拟函数,系统又从头来找类的实例C,发现C重载(override)了Func,好了,马
//上执行该函数. 结果是Func In C
c.Func();
//检查d的实例类D,发现其没有和接口I捆绑,系统继续找它的父类. 发现A和I捆绑了,他就去找
//函数A,发现A是虚拟函数,系统又从头来找类的实例D,但是D里没有重载(override)Func(而是
//用new覆盖了),所以又会到D的父类里找,所以还是执行A的Func(),结果是Func In A
d.Func();
}
以后看interface时记得看清楚了,哈哈!
出处:鱼儿和小鱼的窝
转载时必须以链接形式注明出处及本声明!
牛C网推荐您再看看以下日志:
ASP.NET中字符串处理的几个方法
ASP.NET可交互式位图窗体设计
实例-用Visual C#制作新闻阅读器
给ASP.Net初学者的关于继承和多态性的例子
ASP.NET技巧-根据身份证判断性别和生日
面向.NET开发人员的Ajax 技术平台策略
从数据库导出数据到word、excel、.txt
.NET下的设计模式研究之桥接模式
利用DataGrid编辑、修改、删除记录
ASP.NET和Oracle连接问题的解决方法
ASP.NET中字符串处理的几个方法
ASP.NET可交互式位图窗体设计
实例-用Visual C#制作新闻阅读器
给ASP.Net初学者的关于继承和多态性的例子
ASP.NET技巧-根据身份证判断性别和生日
面向.NET开发人员的Ajax 技术平台策略
从数据库导出数据到word、excel、.txt
.NET下的设计模式研究之桥接模式
利用DataGrid编辑、修改、删除记录
ASP.NET和Oracle连接问题的解决方法
上一篇



