|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我觉得很重要,一般所说的不重要应该指的是:你学好一种以后再学另一种就很容易了。(因为这样大家可能有一个错觉就是语言不是很重要,只要随便学一种就可以了,其实不是这样的。 第四节、会见接口
对接口成员的会见
对接口办法的挪用和接纳索引唆使器会见的划定规矩与类中的情形也是不异的。假如底层成员的定名与承继而来的高层成员分歧,那末底层成员将掩盖同名的高层成员。但因为接口撑持多承继,在多承继中,假如两个父接口含有同名的成员,这就发生了二义性(这也恰是C#中作废了类的多承继机制的缘故原由之一),这时候必要举行显式的界说:
usingSystem;
interfaceISequence{
intCount{get;set;}
}
interfaceIRing{
voidCount(inti);
}
interfaceIRingSequence:ISequence,IRing{}
classCTest{
voidTest(IRingSequencers){
//rs.Count(1);毛病,Count有二义性
//rs.Count=1;毛病,Count有二义性
((ISequence)rs).Count=1;//准确
((IRing)rs).Count(1);//准确挪用IRing.Count
}
}
下面的例子中,前两条语句rs.Count(1)和rs.Count=1会发生二义性,从而招致编译时毛病,因而必需显式地给rs指派父接口范例,这类指派在运转时不会带来分外的开支。
再看上面的例子:
usingSystem;
interfaceIInteger{
voidAdd(inti);
}
interfaceIDouble{
voidAdd(doubled);
}
interfaceINumber:IInteger,IDouble{}
classCMyTest{
voidTest(INumberNum){
//Num.Add(1);毛病
Num.Add(1.0);//准确
((IInteger)n).Add(1);//准确
((IDouble)n).Add(1);//准确
}
}
挪用Num.Add(1)会招致二义性,由于候选的重载办法的参数范例均合用。可是,挪用Num.Add(1.0)是同意的,由于1.0是浮点数参数范例与办法IInteger.Add()的参数范例纷歧致,这时候只要IDouble.Add才是合用的。不外只需到场了显式的指派,就决不会发生二义性。
接口的多重承继的成绩也会带来成员会见上的成绩。比方:
interfaceIBase{
voidFWay(inti);
}
interfaceILeft:IBase{
newvoidFWay(inti);
}
interfaceIRight:IBase
{voidG();}
interfaceIDerived:ILeft,IRight{}
classCTest{
voidTest(IDerivedd){
d.FWay(1);//挪用ILeft.FWay
((IBase)d).FWay(1);//挪用IBase.FWay
((ILeft)d).FWay(1);//挪用ILeft.FWay
((IRight)d).FWay(1);//挪用IBase.FWay
}
}
共3页:上一页1[2][3]下一页
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 |
|