<1>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace interface接口
{
//接口什么时候用? 当一个类需要多继承的时候就要考虑用接口了。因为类是单继承的。而接口是可以多继承的。
//接口是一种规范,同时也是一种“能力” 。怎么理解这个能力呢?打个比方,有一个“人”的类。“人”这个类有 “吃”“喝”“拉”“撒”等方法。 一个人就只能干这些事情。但是我现在想打篮球。那么就可以考虑写一个接口。让这个接口实现“打篮球”这个能力 然后让这个“人”这个类来继承这个接口就行了。(那么有人就要问了,我直接在“人”这个类里添加一个“打篮球的方法不就行了吗”? 的确是可以这样,但是有的人要打篮球,可是有的人不要打篮球,他要踢足球呢?所以,这里同样也可以将“踢足球”这个功能写成一个接口。谁想要什么功能直接去继承想要功能就可以了)
//那怎么理解接口是一种规范呢? 答案: 假如我定义了一个接口,里面有5个抽象方法。 那现在有2个类都继承了这个接口,既然这两个类都继承了这个接口,那么他们都需要实现这个接口中的5个抽象方法,所以这就保证了,这两个类中都会有接口中的5个方法,这就是一种规范
//接口的声明 接口的名字一般是以“I”开头 以“able”结尾表示能力。
//接口中的成员不允许添加访问修饰符。默认的就是public
//接口中有方法,但是不能有方法体。它的方法只能在继承它的类中实现此方法。
//接口中的方法都必须是abstract的
//接口中方法可以有返回值
//接口中可以有“属性”,“索引器”,“事件”和“方法”。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。(其实属性,索引器和事件的本质就是方法。所以说接口中就只能有方法)
//接口是多继承的。一个类只能继承一个类,但是可以继承多个接口。同样,接口也可以继承接口,但是接口不能继承类。
//如果一个类A同时继承了类B,和接口Icable的时候,那么在语法上类B必须写在Icable前面;示例:public class A:B,Icable
//一个类继承一个接口,就必须要实现接口中的所有的成员。
//为了多态,接口是不能被实例化的。即:Idalanqiuable da=new Idalanqiuable()是错误的。因为接口中的成员都是没有方法体的,也就是说都没有实现的。如果能创建对象来调用自己的方法,没有一点意义。所以就规定接口是不能被实例化。要想实现多态,那么就将 Idalanqiuable 指向一个子类对象;即:Idalanqiuable d=new Person() 用d来调用接口中的方法(实际调用的是子类实现了的接口方法)
//总结一下,抽象类,静态类,和接口是不能被实例化的。
//-----------------------------------//声明一个打篮球功能的接口
public interface Idalanqiuable
{
void Dalanqiu();
string Test();
string Name { get; set; } //属性其实是由get方法,和set方法组成的。注意:这个Name属性是一个自动属性,它里面的get方法和set方法都是没有方法体的。
//string Name 错误,接口中不能包含字段
}
//-----------------------------------//声明一个踢足球功能的接口
public interface Itizuqiuable
{
void Tizuqiu();
}
//-----------------------------------//声明一个超级功能的接口。这个接口还同时继承了踢足球和打篮球功能的接口。
public interface ISuperable : Idalanqiuable, Itizuqiuable //之所以要声明这个接口是要展示:接口可以继承接口
{
void All();
}
//-------------------------------------------声明一个Student类。这个Student类继承了这个超级接口。而这个超级接口又继承了两个其他的接口,所有这个Student类就要全部实现这个超级接口的所有成员,及超级接口继承了其他接口的所有成员
public class Student:ISuperable //之所以声明这个类主要用来展示:一个类继承一个超级接口的时候,它需要实现超级接口所有方法,及超级接口所继承的其他接口的所有方法
{
public void Dalanqiu() //实现Idalanqiuable接口中的方法。
{
Console.WriteLine("我会打篮球");
}
public string Test() //实现Idalanqiuable接口中的方法。
{
return "测试接口中的方法是可以有返回值的";
}
public string Name { get; set; }//实现Idalanqiuable接口中的属性
public void Tizuqiu() //实现Itizuqiuable接口中的方法。
{
Console.WriteLine("我会踢足球");
}
public void All() //实现ISuperable接口中的方法。
{
Console.WriteLine("我是超级接口的方法,我本事可大了。可以吃喝拉撒");
}
}
//----------------------------------//声明一个Person类。让他继承Idalanqiuable 打篮球功能接口。
public class Person : Idalanqiuable //Person必须实现Idalanqiuable接口的所有成员
{
public void SayHello()
{
Console.WriteLine("大家好,我是一个人");
}
public void Dalanqiu() //实现Idalanqiuable接口中Dalanqiu()这个抽象方法
{
Console.WriteLine("我会打篮球");
}
public string Test() //实现Idalanqiuable接口中Test()这个抽象方法
{
return "测试接口中的方法是可以有返回值的";
}
public string Name { get; set; } //实现Idalanqiuable接口中的Name属性
}
//------------------------------------------入口、Main函数
class Program
{
static void Main(string[] args)
{
Idalanqiuable d = new Person(); //这里new了一个Person对象
d.Dalanqiu(); // 调用接口中的Dalamqiu()方法。其实实际上调用的是子类实现了的接口方法。:注意,这里的d只能调用Idalanqiuable中定义的方法成员(虽然最终实际上是调用子类的同名方法) 不能调用子类的其他方法成员 -----这里输出:我会打篮球
//d.SayHello()错误。无法调用子类的独有的方法。
//d.Name = "张三";
//Console.WriteLine(d.Name);
Person p = new Person(); // 这里又new了一个Person对象。注意:这个p与d是完全不相干的两个对象。
p.Dalanqiu();
p.Test();
p.SayHello();
p.Name = "李四"; //这里给p这个对象的Name属性赋值
Console.WriteLine(p.Name); //输出:李四。
Console.WriteLine(d.Name); //因为d这个对象的Name属性没有赋值。所以这里什么也不会输出
Console.ReadKey();
}
}
}