/**/ /********************************************************************** *接口 *接口成员的几个注意点: *1. 不能有静态成员; *2. 接口成员默认访问方式是public,但前面不能写任何修饰符. *3. 接口成员不能同名,如果是接口继续接口,可以对父接口中的方法重新声明,我们说接口 * 成员覆盖了继承而来的成员,编译器不会报错,但会给出警告.关闭警告的方法是在成员 * 定义前面加上 new(见例1) *4. 子接口不一定要继承父接口的全部方法,但实现方法时,一定要全部实现.(见例2) *5. 显式的接口实现(见例3) * 使用显式接口的两个目的: * 1) 一个类只在内部使用该接口,而类的使用都不会直接使用到该接口; * 2) 避免了接口成员之间因为同名而发生混淆.如果一个类希望对名称和返回类型相同的 * 接口成员彩不同的实现方式,就必须使用显式接口成员执行体. * 显式接口的访问方式: * 1) 不能通过类的实例访问; * 2) 通过接口的实例访问. *6. 接口映射(见例4) * 映射过程: * 1) 如果C中存在一个显式的接口成员执行体,则由它来实现Member; * 2) 如果1)不成立,但C中存在一个非静态的隐式的接口成员执行体,则由它来实现Member; * 3) 如上述条件还不满足,则到类C的基类列表中寻找,如基类D,用它来替代C,然后重复1)2) * 步骤(见例5); * 4) 还没找到,就报错吧.(辛苦了辛苦了 -_-!) * 接口映射时,还要注意一点: * 1) 显式说明的接口成员最优先实现; ***********************************************************************/ // 例1 publice interface AudioMedia ... { void Play();} public interface Audio:AudioMedia ... { new void Play();} // 例2 public interface AudioMedia ... { void Play(); } public interface Audio:AudioMedia ... { void Close();} public class MP3:Audio ... { public void Play() ...{} public void Close() ...{}} // 例3 public interface AudioMedia ... { void Play();} public interface Audio:AudioMedia ... { void Close();} public class Mp3:Audio ... { void AudioMedia.Play() //注意写法,且不需要public ...{ Console.WriteLine("Mp3 is playing..."); } void Audio.Close() //注意写法,且不需要public ...{ Console.WriteLine("Mp3 is closeing..."); }} public static void Main() ... { Mp3 mp3 = new Mp3(); AudioMedia am = (AudioMedia)mp3; am.Play(); //通过接口的实例访问 Audio a = (Audio)mp3; a.Close(); //通过接口的实例访问} // 例4 public interface IInterface ... { void Member();} public class C:IInterface ... { public void Member() //隐式 ...{} //void IInterface.Member() //显式 //{}} // 例5 public class D ... { public void Member() ...{}} public interface IInterface ... { void Member();} public class C:D,IInterface // 类C中没有实现Member,就到它的基类中找 ... { }