接口,刚开始对于什么是接口,这个概念真的狠模糊,更不用说到底有什么用?当初一个初层面的了解是,接口能提供一个很好的嵌入点,与原来程序整合,也能更方便程序的扩展性。其实在C#里,接口是对其子类(派生类)的约束。当类继承了一个接口,则必须得实现接口里面的方法。
接口(interface),关键字:interface,接口类名一般以大写字母“I”开头
比如声明一个打印接口类
public interface IPrint
{
string Str
{ get; set;}
void Print();
}
在接口里面需要注意的细节有很多,下面就一一介绍:
1.在接口里面的成员的访问修饰符默认都是public,不能为其他的修饰符,但是也不需要显示指定访问修饰符,显示指定访问修饰符会出现错误的;
就如上例的IPrint 接口中的Print()方法声明。
2.接口是抽象的另外一种特殊实现的机制。接口里的成员都必须不能含有实现;只能在派生类(子类)中实现。
3.在派生类(子类)中必须实现接口的所有方法成员;如上面IPrint接口,派生出一个类,则必须实现Print()方法和属性Str:
代码:public class Test:IPrint
{
strng str;
public string Str
{
get{ return str;}
set{ str=value;}
}
public void Print()
{
Console.WriteLine("");
}
}
4. 可访问性不一致的问题:一个类继承另一个类,子类的可访问性要与父类的可访问性一致,或者比父类的可访问性要低。如父类IPrint的访问修饰符是internal,那么子类Test的访问修饰符必须也是internal;父类IPrint的访问修饰符是public,那么子类Test的访问修饰符可以是internal 或public 。
5. 一个类可以从多个接口中派生。然而类不可以从多个类中派生,接口就补充了这个缺点。其实一个类可以同时继承一个类和一个或者多个接口,但是继承的类名必须在所有的接口名前。
如public class Test: Object,IPrint{..........}
//注:其实接口也默认从Object类中派生出来
6.如果多个接口里有同名方法,必须添加接口名在前,并且不要声明访问修饰符,具体例子二详细介绍。
练习代码:
例子一:
interface ITest
{
void Show();
string MyName //属性 一个属性的签名 在子类中也必须实现
{
get;
set;
}
//接口里不能有字段,因为字段不可能是抽象的
}
public class MyTest : ITest //如果一个类有多重继承,那么基类必须放在所有接口之前
{
string myName;
public void Show()
{
Console.WriteLine("子类实现所继承接口的方法");
}
/// <summary>
/// 实现接口的属性
/// </summary>
public string MyName //属性是用来封装字段的访问
{
get { return myName; }
set { myName = value; }
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
例子二:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
M mm = new M();
mm.Show();
//调用接口实现的两种方法
((IA)mm).Show();
IB ib = mm;
ib.Show();
Console.Read();
}
}
interface IA
{
void Show();
}
interface IB
{
void Show();
}
class M : IA, IB
{
/// <summary>
/// 多义性问题,要明确实现了哪个接口的方法
///
/// </summary>
public void Show()
{
//这个方法并不是对所继承的接口的方法的实现,而是类本身自己的方法
//但是如果下面两个IA.Show()和IB.Show()都不存在时,编译都会通过,其实并不是对接口的实现
//但是如果接口有同名方法,则默认使用该方法
Console.WriteLine("类M自己的Show方法");
}
//下面的实现方法,才是对所继承的接口的实现
//多个接口的同名方法的实现,必须添加接口名在前,并且不要声明访问修饰符
//如果多个接口的同名方法要使用相同的实现,那么不要实现下面两个方法,只是用上面的一个方法即可
void IA.Show()
{
Console.WriteLine("接口IA的Show方法");
}
void IB.Show()
{
Console.WriteLine("接口IB的Show方法");
}
}
interface IC<T>
{
void Show();
}
}