接口的日常实现
1.隐式实现
public interface IChinese
{
string Speak();
}
public class Speaker : IChinese
{
public string Speak()
{
return "中文";
}
}
调用:
IChinese s = new Speaker();
s.Speak();
Speaker s = new Speaker();
s.Speak();
2.显式实现
public interface IEnglish
{
string Speak();
}
public class Speaker : IEnglish
{
string IEnglish.Speak()
{
return "English";
}
}
调用:
IEnglish s = new Speaker();
s.Speak();
不允许:不能找到对应的实例对象
Speaker s = new Speaker();
s.Speak();
实例:
1 using System; 2 public interface IPerson 3 { 4 string Name 5 { 6 get; 7 set; 8 } 9 void Show(string name); 10 } 11 public interface IStudent 12 { 13 string StudentId 14 { 15 get; 16 set; 17 } 18 void Show(string studentid); 19 } 20 public class Student: IPerson, IStudent 21 { 22 private string _name; 23 public string Name 24 { 25 get 26 { 27 return _name; 28 } 29 set 30 { 31 _name = value; 32 } 33 } 34 private string _studentid; 35 public string StudentId 36 { 37 get 38 { 39 return _studentid; 40 } 41 set 42 { 43 _studentid = value; 44 } 45 } 46 void IPerson.Show(string name) 47 { 48 Console.WriteLine("姓名为{0}", name); 49 } 50 void IStudent.Show(string studentid) 51 { 52 Console.WriteLine("学号为{0}", studentid); 53 } 54 } 55 class Program 56 { 57 static void Main() 58 { 59 Student s = new Student(); 60 Console.WriteLine("输入姓名"); 61 s.Name = Console.ReadLine(); 62 Console.WriteLine("输入学号"); 63 s.StudentId = Console.ReadLine(); 64 IPerson per = s; 65 per.Show(s.Name); 66 IStudent stu = s; 67 stu.Show(s.StudentId); 68 } 69 }
隐示实现对象声明为接口和类都可以访问到其行为,显示实现只有声明为接口可以访问。
如果两个接口中有相同的方法名,那么同时实现这两个接口的类,就会出现不确定的情形,在编写方法时,也不知道实现哪个接口的方法了。为解决这一问题,C#提供了显示接口实现技术,就是在方法名前加接口名称,用接口名称来限定成员。用“接口名.方法名()”来区分实现的是哪一个接口。
注意:显示接口实现时,在方法名前不能加任何访问修饰符。这种方式和普通方法不同,普通方法前不加访问修饰符,默认为私有的,而显式接口实现时方法前不加任何修饰符,默认为公有的,如果前面加上修饰符,会出现编译错误。
调用显示接口实现的正确方式是通过接口引用,通过接口引用来确定要调用的版本。