接口
接口:
生活中,需要一些规范和标准,如汽车轮胎坏了,只需要更换同样规格的轮胎,一个支持USB接口的设备,如移动硬盘,手机,MP3,都可以插入计算机器的USB 中进行数据传输,
都是因为规范和标准
软件开发中由接口规定以系列的标准,继承同一接口的程序从而遵循了同一种规范,这样程序就可以相互替换,便于程序的扩展
接口时引用类型,接口定义一个协议,包含方法属性等成员,只描述成员的签名,不提供代码的实现,具体实现由接口继承类去实现,实现接口又必须遵守协议,按接口所规定的形式去实现
特点:
1.一个类只能有一个基类
2.接口中不能包含字段和const常量
3.在接口中,可以存在方法,但是方法不能使用任何访问修饰符
4.可以存在方法,但是方法不能有实现,只能有方法的声明
5.接口不能直接的实例化对象,可以间接的实现
6.接口中所有的成员,默认的访问级别都是public
7.当一个类继承接口的时候,需要写出接口中声明的所有方法
8.继承接口的类中写出与接口同名的方法,参数类型以及个数也必须与接口中相同
9.接口更像是提供了一套规则,要求所有继承接口的类都必须遵守 制定通用的规则
10. 由于C#语言不支持多重继承(,类中只允许单继承),而接口支持多继承;
11. 父亲类其实是为了个子类提供公共的特征;接口,结构体,枚举,类,一个级别
12. class A:C(基类必须写在前面),I(接口1) ,l(接口2)
形式:
interface f{
//【字段】
//接口不能包字段和常量;
// public int age ;
// public const int a=12;
//【方法】
//接口中存在方法,但是不能有访修饰符,接口中所有的成员默认级别都是public;
//只能有方法声明,不能有方法实现;
void Fly();
//不能直接实例化对象,但可以间接实现;
//所以没有 interface a = new intrface();这样的实例化;
//【属性的声明】
//和方法比较没有括号
int age{
get;
set;
}
}
// 要求继承的方法
// 1.访问修饰符,与接口中声明的方法级别相同 public
// 2.要求方法的返回值类型,以及方法的名字必须相同 float
// 3.参数类型必须相同,但参数名可以不同 float r float s
interface IArea
{
float Area(float r); //public
}
interface IVolume
{
float Volume(float r);
}
class Ball:IArea,IVolume
{
public float Area(float s)
{ return (float)(4*Math.PI*s*s);
}
public float Volume(float r)
{
return (float)(4/3 * Math.PI * Math.Pow(r,3)); //Math.pow(a,3)------几次方的函数
}
}
//1.接口继承接口;也必须实现所有的方法;
interface aa{
void r();
}
interface cc{
void r();
}
interface b:aa
{
void r();
}
//2.1普通的类继承接口:必须实现接口中所有的成员方法;
class c:aa
{ public void r()
{
Console.WriteLine ("1");
}
}
//2.2普通的类继承接口
class e:aa,cc
{
//同名了一个函数代表俩个方法了
public void r()
{
Console.WriteLine ("1");
}
//当方法出现同名的时候
//【显示实现】
// 显式实现,通过 【接口.对象】 来调用
// 当两个接口中,出现同名方法的时候,无法区分同名方法
// 需要对其中一个接口中的方法使用显示实现
//类。方法
void aa.r(){
Console.WriteLine ("aa的接口继承");
}
void cc.r(){
Console.WriteLine ("cc的接口继承");
}
}
//3.抽象类继承接口:
其实并不是必须实现他的方法,只不过是感觉是(不抽象只能实现);
其实是要求:类中必须出现一个类中与他同名的方法;当一个类继承接口的时候,不
是必须要实现接口中所有的方法 而是,要求继承接口的类中必须出现与接口同名的方法
abstract class d:aa
{
//解决方案1 (方法的实现)
public void r()
{
Console.WriteLine ("2222");
}
//解决方案2 (方法的声明)
public abstract void r();
}
//4.静态类不能继承接口,静态和接口是冲突的;
static class axa:a
{
public void r(){
Console.WriteLine ("3333");
}
}
}
【默认方法级别】
//internal enum struct class interface 当前工程中,程序集
// { { { {
//成员 public private private public且和枚举一样不能修改访问级别,类和结构体中的可以修改;
// } } } }
【接口与抽象类】
联系:
//1 用接口去强制的让所有遵守的人都谁去实现;抽象类中只有抽象方法必须去实现
//2 接口与抽象类非常相似,它定义了一些未实现的属性和方法。所有继承它的类都继承这些成员,在这个角度上,
//3两者都不直接实例化。
区别:
1.概念上
//1.接口中所有的方法都不能有实现,并且不能指定方法的修饰符
//2.抽象类中可以有方法的实现,也可以指定方法的访问修饰符
//3.【第一个】继承接口的【类】必须实现接口里的所有方法()
//4.C#只支持单继承,即子类只能继承一个父类,而一个子类却能够实现多个接口。
//5抽象类除拥有抽象成员之外,还可以拥有非抽象成员;而接口所有的成员都是抽象的。
//6抽象成员可以是私有的,而接口的成员默认是公有的。
//7接口中不能含有构造函数、析构函数、静态成员和常量,-只能有方法和属性(也可以有事件和索引器的声明)
2.使用上
抽象类可以有实现,也可以没有实现,所以抽象类用来封装所有派生类的通用功能(即方法),接口是完全没有实现的,因此无法用来实现通用功能(作为基类),更多的是用类制定程序的开发规范,接口的实现代码是有开发者完成的,例如:有关xml文档的处理,有万维网联盟制定的一个DOM(文档对象模型)规范,具体的实现是由Microsoft Sun,等公司去实现的。