我看接口(一)
1.接口的定义
(1)如何定义一个接口
用interface 后跟接口的名称,接口名用大写字母I开头
interface Icomputer
{
int Computer(int i); //仅需要方法的声明和一个分号,不需要大括号。默认为public
}
(2)用一个类类实现接口,两方法声明必须保持完全一致,其实就相当于在类里声明方法的主体,
方法前面要加上修饰符public,表示是一个公共的。
interface Icomputer
{
int Computer(int i);
}
class HardWare : Icomputer //如果没有实现这个接口,那么无法进行实现接口的声明,接口无法指向没有实现接口的类。
{
public int Computer(int i) //在类里声明方法的主体,方法前面要加上修饰符public
{
return 10;
}
}
(3)子类只能继承一个父类,但可以实现多个接口,子类的后面要跟上父类,然后,实现接口
interface Icomputer
{
int Computer(int i);
}
class HardWare
{
}
class SoftWare:HardWare,Icomputer
{
public override int Computer(int i)
{
return -30;
}
}
(4)接口无法实例化,需要指向实现这个接口的类,或者声明接口为null。
(5)多接口的实现
①两个接口指向同一个类的同一个方法
class Program
{
static void Main(string[] args)
{
Animal animal1 = new Animal();
animal1.Say();
Ianimal ianima2 = animal1;//Ianimal接口的变量指向Animal这个类的对象
ianima2.Say(); //调用Animal这个类实现接口的方法
Ibeasite ibeasit2 = animal1;//Ibeasite接口的变量指向Animal这个类的对象
ibeasit2.Say(); //调用Animal这个类实现接口的方法
Console.ReadKey();
}
}
interface Ianimal
{
void Say();
}
interface Ibeasite
{
void Say();
}
class Animal:Ianimal,Ibeasite 一个类实现两个接口
{
public void Say()
{
Console.WriteLine("动物叫");
}
}
★★★★★这个其实相当于两个接口都调用一个类的同一个方法。
②一个类分别实现两个接口的同一方法。
class Program
{
static void Main(string[] args)
{
Animal animal1 = new Animal();
//animal1.Ianimal.Say(); //§§无法这样进行调用 类可以实例化,但无法进行方法的调用
Ianimal ianima2 = animal1;
ianima2.Say();
Ibeasite ibeasit2 = animal1;
ibeasit2.Say();
Console.ReadKey();
}
}
interface Ianimal
{
void Say();
}
interface Ibeasite
{
void Say();
}
class Animal:Ianimal,Ibeasite
{
void Ianimal.Say() //前面不能有修饰符,接口的名称.方法名
{
Console.WriteLine("动物叫Ianimal");
}
void Ibeasite.Say() //前面不能有修饰符,接口的名称.方法名
{
Console.WriteLine("动物叫Ibeasite");
}
}
③如果两个子类,都用到了同一个方法,那么可以把该方法写到父类里,子类进行继承。
class Program
{
static void Main(string[] args)
{
Animal animal1 = new Animal();
//animal1.Ianimal.Say(); //§§无法这样进行调用
Ianimal ianima2 = animal1;
ianima2.Say();
Ibeasite ibeasit2 = animal1;
ibeasit2.Say();
//羊和马都有一个Chicao这个方法,所以把它写到父类里,子类进行继承
羊 yang = new 羊();
yang.Chicao();
马 ma = new 马();
ma.Chicao();
Console.ReadKey();
}
}
interface Ianimal
{
void Say();
}
interface Ibeasite
{
void Say();
}
class Animal : Ianimal, Ibeasite
{
void Ianimal.Say()
{
Console.WriteLine("动物叫Ianimal");
}
void Ibeasite.Say()
{
Console.WriteLine("动物叫Ibeasite");
}
public void Chicao()
{
Console.WriteLine("吃草");
}
}
class 羊:Animal
{
}
class 马:Animal
{
}
④★★★★★但是现在又有一个问题,假设还有一个牛吃草这个动作,但是牛吃草这个方法跟羊和马都不一样,那么怎么办?
class Program
{
static void Main(string[] args)
{
Animal animal1 = new 羊();
animal1.Chicao(); //子类继承父类Chicao的方法
animal1 = new 牛();
animal1.Chicao(); //子类重写方法,父类进行调用
Ianimal ianimal =new 羊();//子类羊也要实现这个接口,且接口和子类里都有一个方法Chicao,那么接口才能调用子类的Chicao方法。
ianimal.Chicao(); //接口调用子类的方法。
Console.ReadKey();
}
}
interface Ianimal
{
void Say();
void Chicao();
}
class Animal : Ianimal
{
public void Say()
{
Console.WriteLine("动物说");
}
public virtual void Chicao()
{
Console.WriteLine("动物羊马吃草");
}
}
class 羊 : Animal, Ianimal, Ibeasite
{
}
class 马 : Animal, Ianimal
{
}
class 牛 : Animal, Ianimal
{
public override void Chicao() //牛如果想用自己的方法,那么要对方法进行重写。
{
Console.WriteLine("牛开始吃草");
}
}
小结:
(1)用interface 进行接口的声明,接口用I作为接口名称的开头.接口中的方法,默认的是public。
接口中的方法必须与实现接口的类中的方法相一致,也可以说是在接口中不声明方法的主体,而在实现接口的类中实现接口中方法的主体,且类中的方法用public进行修饰,以便外界进行访问。
(2)多个接口可以调用一个类中的同一个方法。
(3)一个类中可以实现多个接口中的名称相同的方法,但要在类中的方法名前用 接口名.方法名
(4)如果几个子类的方法相同的话,可以把子类相同的方法,写到父类里,父类的方法名最好用virtual进行修饰。以便可以直接调用子类重写的方法。
★★子类可以对相同的方法从父类中进行继承。
★★如果子类有的方法和父类不同,那么子类只需要在前面用override进行修饰重写,其他子类仍旧可以继承父类的方法。
(5)如果接口想要调用子类的方法。那么必须在接口中声明子类的方法,且子类后面必须实现接口。