接口是一种能力,也是一种规范。
只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员
接口的功能要单一
为了多态。
接口不能被实例化。
也就是说,接口不能new(不能创建对象)
跟抽象类是一样的,因为创建对象也没意义。
接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,不能修改。
类中的成员默认的访问修饰符是private ,而接口中默认的访问修饰符是public
(默认为public)
接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。
接口中只能有方法、属性、索引器、事件,不能有“字段”和构造函数。
接口与接口之间可以继承
接口并不能去继承一个类,而类可以继承接口 (接口只能继承于接口,而类既可以继承接口,也可以继承类)
实现接口的子类必须实现该接口的全部成员。
一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,并实现了接口IA,那么语法上A必须写在IA的前面。
class MyClass:A,IA{},因为类是单继承的。
显示实现接口的目的:解决方法的重名问题
什么时候显示的去实现接口:
当继承的接口中的方法和参数一摸一样的时候,要是用显示的实现接口
当一个抽象类实现接口的时候,需要子类去实现接口。
例子1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 接口
{
class Program
{
static void Main(string[] args)
{
Student s1 = new Student();
s1.CHLSS();
s1.koulan();
Teacher t1 = new Teacher();
t1.CHLSS();
t1.koulan();
Console.ReadKey();
}
}
class Peson
{
public void CHLSS()
{
Console.WriteLine("人类可以吃喝拉萨睡");
}
}
class Student : Peson ,Ikoulan//学生想吃喝 还想扣篮 可是不能继承两个类 因此把扣篮做成接口
{
public void koulan()
{
Console.WriteLine("学生可以扣篮");
}
}
class Teacher : Peson, Ikoulan//学生想吃喝 还想扣篮 可是不能继承两个类 因此把扣篮做成接口
{
public void koulan()
{
Console.WriteLine("老师可以扣篮");
}
}
interface Ikoulan
{
void koulan();
}
class NBAPlayer : Peson
{
public void koulan()
{
Console.WriteLine("NBA球员可以扣篮");
}
}
}
例子2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 接口2
{
class Program
{
static void Main(string[] args)
{
IFly[] flys = { new MaBird(),new YingwuBird(),new Plame()};
foreach (IFly i in flys)
{
i.Fly();
}
Console.ReadKey();
}
}
class Bird//父类 存储共性属性
{
public void CHLSS()
{
Console.WriteLine("Bird can 吃喝拉撒水");
}
}
interface IFly
{
void Fly();
}
class MaBird : Bird, IFly
{
public void Fly()
{
Console.WriteLine("MaBird can fly");
}
}
class TuoBird : Bird
{
}
class YingwuBird : Bird, IFly
{
public void Fly()
{
Console.WriteLine("YingwuBird can fly");
}
}
class Plame : IFly
{
public void Fly()
{
Console.WriteLine("Plame can fly");
}
}
}
例3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _15接口登记案例
{
class Program
{
static void Main(string[] args)
{
//Person需要登记
//House房子也需要登记
//汽车也需要登记
//财产登记
//最后写一个函数 来实现以上物品的登记
DengJi(new Person());
DengJi(new House());
DengJi(new Car());
DengJi(new Money());
Console.ReadKey();
}
static void DengJi(IDengJi dj)
{
dj.DengJi();
}
}
interface IDengJi
{
void DengJi();
}
class Person : IDengJi
{
public void DengJi()
{
Console.WriteLine("人出生就要登记");
}
}
class House : IDengJi
{
public void DengJi()
{
Console.WriteLine("买房子也要登记");
}
}
class Car : IDengJi
{
public void DengJi()
{
Console.WriteLine("买汽车也要登记");
}
}
class Money : IDengJi
{
public void DengJi()
{
Console.WriteLine("财产也要登记");
}
}
}