接口和抽象类
抽象类继承自接口后,接口里的方法被抽象类继承后可以改写为抽象方法,当然也可以像类继承接口那样直接实现接口,代码示例如下:
interface IA { void PlayA(); }
abstract class TB:IA
{
public abstract void PlayA();
public abstract void PlayB();
}
接口和类
接口和类之间的关系就是赤裸裸的实现关系,类继承了接口就必须将其实现,这是继承接口类的责任。对于接口里的方法,虽然没有访问修饰符,但类继承过来以后要用public访问修饰符来实现,代码示例如下:
interface IA { void PlayA();}
class TB :IA
{
public void PlayA()
{
Console.WriteLine("A Interface Play");
}
}
接口、类、和抽象类
一个类可以同时继承自类、抽象类和接口。如果子类继承列表中有类或抽象类还有接口,那么类或抽象类写在前面,接口写在后面。子类对每一个继承元素要按照其本身的规则来实现,比如必须实现抽象类里面的抽象方法,必须实现接口里面的方法等,代码示例如下:
interface IA { void PlayA(); }
interface IB { void PlayB(); }
abstract class TC
{
public abstract void PlayC();
}
class TD:TC,IA,IB
{
……
}
对于接口还应该注意一些问题。比如,我们说接口中只能声明方法(包括属性、索引器),接口中的方法只能声明不能实现,并且方法没有访问修饰符,使用默认访问修饰符public。所以下面的几种情况是错误的:
interface IShow
{
public void IShow();
}
或
interface IShow
{
void IShow() { Console.WriteLine(""); };
}
或
interface IShow
{
string name;
void IShow();
}
下面几种情况是正确的:
interface IShow
{/*在接口中声明属性*/
string Name {get;set;}
}
和
interface IShow
{/*在接口中声明索引器*/
string this[int n] {get;set;}
}
另外和抽象方法一样,接口的方法也不能使用static关键字,类一旦继承了接口,就必须实现这个接口中的每一个方法,下面是一个综合使用接口的例子:
using System;
using System.Collections.Generic;
using System.Text;
namespace Test
{
interface IA
{
void PlayA();
string Name {get;set;}
}
interface IB
{
void PlayB();
string this[int n] { get;}
}
abstract class TC
{
public abstract void PlayC();
}
class DEntity :TC,IB,IA
{
private string name="小明";
private string [] ids=new string[] {"AX","BX","CX"};
public void PlayA() { Console.WriteLine("IA Function 执行"); }
public void PlayB() { Console.WriteLine("IB Function 执行"); }
public override void PlayC() { Console.WriteLine("TC Function 执行"); }
public string this[int n] { get { return ids[n]; }}
public string Name
{
get { return name; }
set { name=value; }
}
}
class Program
{
static void Main(string [] args)
{
IA ia=new DEntity();
Console.WriteLine(ia.Name);
IB ib=new DEntity();
Console.WriteLine(ib[0]);
TC tc=new DEntity();
tc.PlayC();
}
}
}
显示结果:
小明
AX
TC Function 执行
我们在上面定义了两个接口和一个抽象类,然后定义了一个继承自它们的类。在两个接口里,我们分别定义了属性和索引器,这里要注意的是,接口里定义属性和索引器时的书写语法以及实现语法,这些要注意的问题都是C#中的语法,是需要死记的东西。而接口概念却需要仔细理解。
显式接口实现——解决接口继承时的同名方法冲突
在上面介绍接口的过程中我们知道如果一个类继承了一个接口,那么这个类就必须实现接口里定义的所有的方法,我们还知道一个类可以继承多个接口。那么问题来了,要是两个接口中有同名的方法,而这两个接口又被同一个类继承,那会出现什么情况呢?这就涉及到显式实现接口的技术。如果发生了这种情况,你需要使用显式接口实现语法,语法很简单,有两个注意点:首先应该在实现的方法上带上接口名,然后注意显式接口方法访问修饰符不能为公共(public)类型。
using System;
namespace Test
{
interface IX
{
void Show();
}
interface IY
{
void Show();
}
class Point :IX,IY
{
void IX.Show()
{
Console.WriteLine("IX Show");
}
void IY.Show()
{
Console.WriteLine("IY Show");
}
}
class Program
{
static void Main(string [] args)
{
//使用接口
IX ix=new Point();
ix.Show();
IY iy=new Point();
iy.Show();
Point point=new Point();
point.Show();
}
}
}
运行结果:
IX Show
IY Show