声明接口
定义:是指一组函数成员而不实现他们的引用类型,所以只能类和结构来实现接口
PS:接口的方法不需要具体的实现
实现类要做的事情
- ?必须在基类列表后面列出接口的名称
- ?必须为接口的每一个成员(方法)提供实现?
- Run()方法是接口实现方法
- 接口不能定义字段和静态成员?
- 接口成员不允许有任务的访问修饰符,默认是public
- ?接口名必须要以大写‘I‘开头(IText)
public interface IAnimal{ void Run(string AnimalName); } class Cat:IAnimal{
public void Run(string name){ Console.WriteLine($"{name} can be run") } }
class Dog: IAnimal{
public void Run(string name){
Console.WriteLine($"{name} can be run")
}
}
public class Program{
public static void Main(){
Cat cat = new Cat();
cat.Run("cat");
Dog dog = new Dog();
dog.run();
}
}
接口是引用类型
接口不仅仅类或结构要实现的成员列表。他是一个引用类型
一个类可以继承多个接口
接口定义方法的具体实现的载体? public class StructClass:IClass{ int count = 0; public void AddCount(){ count +=1; } public void ShowCount(){ Console.WriteLine(count) } }
public interface IClass{
void AddCount();
void ShowCount();
} class Program { ? static void Main(string[] args) { ?
StructClass s1 = new StructClass(); ?StructClass s2 = s1; ?s1.AddCount(); ?s1.ShowCount(); //输出1 ?s2.ShowCount(); //输出0 ? //说明s2和s1不指向同一个对象,s2=s1是创建了一个s1的副本 ? //这是值类型很显著的标志 ? ?IClass ic1 = new StructClass(); ?IClass ic2 = ic1; ?ic1.AddCount(); ?ic1.ShowCount();//输出1 ?ic2.ShowCount();//输出1 //说明s2和s1指向同一个对象,s2=s1是将s1的引用赋给s2 ? //这是引用类型很显著的标志 ?} }
接口和as运算符
定义:使用as 运算符可以指定接口所实现的类
//如上图代码稍作修改 public static void Main(){ StructClass s1 = new StructClass(); IClass ic1 = s1 as IClass; ic1.AddCount(); ic1.ShowCont(); //输出1 }
多个接口同名方法的引用用显示命名法区分
public interface IClass1{ //输出 void Print(); } public interface IClass2{ //输出 void Print(); } public class StructClass:IClass1,IClass2{ //两种解决方案 //一种多个接口同名方法用一种实现通用解决 public void Print(); //第二种解决方案,使用限定接口名 public void IClass1.Print(){ Console.WriteLine("IClass1 print"); } public void IClass2.Print(){ Console.WriteLine("IClass2 print");
//值得注意一点的是,使用限定接口名会影响类的继承
public void Method1()
Print(); //编译错误
this.Print(); //编译错误
((IClass1)this).Print(); //使用限定后的名称编译 }
}
接口可以继承接口
定义:与类不同,它在基类列表中只能有一个类名,而接口可以在基接口列表中任意多个接口
- 列表中的接口本身可以继承其他接口
- 接口包含它声明的所有接口和所有基接口的成员
- 多个接口被一个接口继承时,当这个集合被实现时,需要实现该接口的的所有接口方法
public interface IClass1{ void Point1(); } public interface IClass2:IClass1{ void Point2(); } public class StructClass:IClass2{ //两个方法都得实现 public void Point1(); public void Point2();
}
public class Demo{
public static void Main(){
StructClass1 s1 = new StructClass1();
DemoTest(s1);
}
public void DemoTest(IClass1 c1){
c1.Point1();
}
}