参考:https://blog.csdn.net/fjxcsdn/article/details/80156615
.接口与抽象类的差别
接口为后续的代码编写提供了一个“”协定“,也就是一个规范。提到接口,很容易让人想到抽象类,因为接口与使用方法与抽象类非常相似。接口的特点就是:(1)不能被实例化(2)自身不提供实现代码。
抽象类与接口的差异:
(1)抽象类的成员定义是带有可访问性关键字(例如:public),而接口是不带可访问性的关键字,因为接口中的声明的成员是公共的,所以没有必要添加访问符号
(2)抽象类除了可以包含抽象成员外,还可以包含非抽象成员,也可以包含构造函数。而接口不能包含具备实现代码的成员,也不能包含构造函数。因为接口是另外一种类型,不是类。而抽象类是类的一种。
2.定义接口
定义接口使用interface关键字
例:public interface IBook{...} //说明使用I开头默认为接口在默认的情况下,将声明为允许内部访问(internal),即只能在同一程序集合中访问,如果让接口对外公开,只需要加上public 即可。
C++中允许多继承,即一个类可以同时继承多个基类。而在C#中只允许单继承,一个类可以有多个派生类,但是一个子类不能同时继承多个基类。注意假设C类可以从A类类中派生,也可以从B类中派生,但是不能同时从A,B类中派生
例子:
public class A{}
public class B{}
public class C:A,B{}//错误
但是C可以可以同时实现两个接口
public interface IA{}
public interface IB{}
public class C :IA,IB {} //正确
3.实现接口
由于接口中定义成员都是公共成员,因此在实现接口的时候,无论实现解口还是实现类,必须以公共成员来实现接口的成员,而且必须实现接口的所有成员。
例子:
public interface IX
{
int Num{get;}
void work();
}
public class Z:IX
{
pritected int num{get;set};//错误:成员没有声明为public
public void work();
}
publci class Y:IX
{
public int Num
{
get{return 0;}
}
//错误:未实现work方法
}
当然接口也可以继承3接口,如果B接口继承成接口A,那么接口B也就包含了A接口中定义的成员
public interface IA
{
void DoA{};
}
public interface IB:IA
{
string Name {get;set;}
}
public class Test:IB
{
public string Name{get;set;}
public void DoA{}
}
namespace Interface
{
class Program
{
static void Main(string[] args)
{
IKL S = new Student(); //声明接口对象
NBAPlayer objNBAPlater = new NBAPlayer();//声明类对象
//接口方法调用
S.KL();
//类方法调用
objNBAPlater.KL();
objNBAPlater.Able();
Console.ReadKey();
}
//声明一个父类
public class Person
{
public void Able()
{
Console.WriteLine( "吃喝拉萨睡");
}
}
class NBAPlayer : Person//声明一个子类,实现扣篮的能力
{
public void KL()
{
Console.WriteLine("i can KL");
}
}
interface IKL //定义了一个接口实现扣篮的能力
{
void KL(); //接口中不加public等修饰符号
}
//扣篮是一种能力,通过调用定义的一个接口可以实现其他类对这种能力的实现。
//继承父类,父类只有一个。实现一个接口,接口可以有多个,接口相当于干爹。
//具有了某种能力后,一定会去实现某种能力
class Student : Person,IKL //继承在前,接口在后
{
public void KL()
{
Console.WriteLine("我也会扣篮了");
}
}
}
}