C#
interface ILeft{ int P { get;}}
interface IRight{ int P();} C# class Middle : ILeft, IRight
{ public int P() { return 0; }
int ILeft.P { get { return 0; } }}以上代码是没问题的,我不明白的是在接口的实现中
public int P() { return 0; }
int ILeft.P { get { return 0; } }
P()方法,如果用显式
public int IRight.P() { return 0; }
int ILeft.P { get { return 0; } }
这样会报修饰符错,请问这是为什么?以上红色字体是我从MSDN中摘录下来的,
对此我也疑惑,
为什么以下代码 class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
的方法P不用显式接口限定为public int IRight.P() { return 0; }
限定后如红色字体的问题,会报错??????
interface ILeft{ int P { get;}}
interface IRight{ int P();} C# class Middle : ILeft, IRight
{ public int P() { return 0; }
int ILeft.P { get { return 0; } }}以上代码是没问题的,我不明白的是在接口的实现中
public int P() { return 0; }
int ILeft.P { get { return 0; } }
P()方法,如果用显式
public int IRight.P() { return 0; }
int ILeft.P { get { return 0; } }
这样会报修饰符错,请问这是为什么?以上红色字体是我从MSDN中摘录下来的,
对此我也疑惑,
为什么以下代码 class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
的方法P不用显式接口限定为public int IRight.P() { return 0; }
限定后如红色字体的问题,会报错??????
interface ILeft { int P { get;} }
interface IRight { int P();} class Middle : ILeft, IRight
{
int IRight.P() { return 0; }//之所以不可以用public,是因为Middle的对象是无法访问此方法的(p方法)只能在把Middle的对象转换为IRight接口后才能访问此方法,如果加上了public,那么Middle对象肯定是可以访问的,所以就冲突了(因为显式实现的接口必须显式转换为接口后才能访问接口中的方法),显式实现接口在某种程度上讲,把接口和接口的方法“隐藏”起来了,在对象的实现中,显示实现的接口的方法被认为是“私有的”
public int P { get { return 0; } }
}
interface ILeft{ int P { get;}}
interface IRight{ int P();} C# class Middle : ILeft, IRight
{ public int P() { return 0; }
int ILeft.P { get { return 0; } }} 以上代码是没问题的,为什么方法P前面加了public还是正确的???这段红色代码是MSDN上抄来的,也是别人发的代码,
难道显式属性P可以直接用类或类的实列调用吗?所以前面可以加public????
而IRight.p()方法却不可以用Middle的对象访问,这就是为什么使用显式属性的原因
class Middle : ILeft, IRight
{ public int P() { return 0; } //由于接口的属性或方法必须公有,所以p方法前必须加public,否则错误,
int ILeft.P { get { return 0; } }} //在Middle对象中是不可见的,所以标识为了ILeft接口
你的意思就是说,使用了显式接口实现的方法或属性前都是不能加publi的吧?因为其在所属的CLASS中是不可见的,
而没有使用显式接口实现的方法或属性是可以加publi的吧,对于两个P成员(一个是方法,一个是属性,)只要其中一个使用了显式接口技术实现了的话,另外一个不需要使用显式接口技术,.NET也是可以正确通过调试的吧??
没有显式实现的方法/属性前一定要加public,因为接口中的成员都是公有的;对于两个P成员(一个是方法,一个是属性,)只要其中一个使用了显式接口技术实现了的话,另外一个不需要使用显式接口技术,.NET也是可以正确通过调试的吧??
这两个接口没有必然联系,所以互不影响
那么
class Middle : ILeft, IRight
{ int IRight.P() { return 0; }
int ILeft.P { get { return 0; } }
} 这样是否也是正确的?就是全部显式接口实现
显式接口实现的方法前之所以不可以用public,是因为显式接口实现的方法默认为公有的,所以语法规定了不能加任何修饰符,(见书<<零基础学c#3.0>>P125,机械工业出版社)但是我不明白,虽然定义接口时候,接口的方法前不能加修饰符,是默认为公有的,为什么在类中实现其方法时候前面一定要加public呢?加internal不可以吗?在本项目(程序集)内访问为什么不可以呢?
{publicint P() {return0; }//由于接口的属性或方法必须公有,所以p方法前必须加public,否则错误,int ILeft.P {get {return0; } }}//在Middle对象中是不可见的,所以标识为了ILeft接口 你的意思就是说,使用了显式接口实现的方法或属性前都是不能加publi的吧?因为其在所属的CLASS中是不可见的,
而没有使用显式接口实现的方法或属性是可以加publi的吧, 对于两个P成员(一个是方法,一个是属性,)只要其中一个使用了显式接口技术实现了的话,另外一个不需要使用显式接口技术,.NET也是可以正确通过调试的吧??