//接口
// 接口与抽象类有些相似,因为它们都提供了用来创建新类的模板.它们之间的不同在于接口不提供任何实现的
//类成员,而抽象类可以实现派生类共用的成员.
// 比起类而言,接口更像类型.当您在一个类中实现某个特定的接口时,这个类的实例可以用于被声明为该接口的
//参数或变量.
//例如下面的代码为前面创建的Shape对象声明了一个接口.
![](/Images/OutliningIndicators/None.gif)
using System;
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
namespace FlashCards
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
![](/Images/OutliningIndicators/InBlock.gif)
public interface IFigure
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
float Top
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
get;
set;
![](/Images/OutliningIndicators/InBlock.gif)
}
float Left
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
get;
set;
}
float Area();
float Perimeter();
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) /**//// <summary>
/// 使用这个接口前,需要在下面的类中实现它
/// </summary>
public abstract class Shape:IFigure
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
public Shape()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
//
// TODO: 在此处添加构造函数逻辑
//
}
![](/Images/OutliningIndicators/ContractedSubBlock.gif) IFigure 成员#region IFigure 成员
![](/Images/OutliningIndicators/InBlock.gif)
public abstract float Top
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
get;
set;
}
![](/Images/OutliningIndicators/InBlock.gif)
public abstract float Left
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
get;
set;
}
![](/Images/OutliningIndicators/InBlock.gif)
public abstract float Area();
![](/Images/OutliningIndicators/InBlock.gif)
public abstract float Perimeter();
![](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
![](/Images/OutliningIndicators/InBlock.gif)
//覆盖抽象类成员的每一个成员定义都需要 Overrides(vb.net) 或 override(c#) 关键字.
public class CirCle:Shape
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
float fxCenter,fyCenter,fRadius;
public CirCle()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
fxCenter=0;
fyCenter=0;
fRadius=0;
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
public override float Top
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) get {return fxCenter-fRadius;} //fx
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) set {fxCenter=value+fRadius;}
![](/Images/OutliningIndicators/InBlock.gif)
}
public override float Left
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) get {return fyCenter-fRadius;} //fy
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) set {fyCenter=value+fRadius;}
}
![](/Images/OutliningIndicators/InBlock.gif)
public override float Area()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return (float)(2*System.Math.PI *Math.Pow((double)fRadius,2 ));
}
public override float Perimeter()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return 2*fRadius*(float)System.Math.PI;
}
![](/Images/OutliningIndicators/InBlock.gif)
public float Radius
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) get {return fRadius;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) set {fRadius=value;}
}
![](/Images/OutliningIndicators/InBlock.gif)
public virtual void Center(float x,float y)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
fxCenter=x;
fyCenter=y;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public class Sphere:CirCle //球体,圆
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
float fCenter;
public Sphere()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
fCenter=0;
}
public override float Area()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return (float)(4*Math.PI *Math.Pow((double)base.Radius ,2) ); //圆的面积
![](/Images/OutliningIndicators/InBlock.gif)
}
public new void Center(float x,float y)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
this.Center (x,y,0);
}
public void Center(float x,float y,float z)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
base.Center(x,y) ;
fCenter=z;
}
public float Volume() //体积
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
return (float)((4/3)*System.Math.PI*Math.Pow((double)base.Radius,3));
}
public float Front
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) get {return fCenter-base.Radius ;}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) set {fCenter=value+base.Radius ;}
![](/Images/OutliningIndicators/InBlock.gif)
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
// 这个示例中的Shape抽象类实现了IFigure接口,所有从Shape派生而来的类都继承了实现的IFigure.
//这就是说,类型CirCle和Sphere的对象是从Shape派生而来,它们能被用作IFigure类型的参数.
// 这里的关键是接口中定义的所有项必定存在于实现该接口的类中 .如果您省略了某个成员,Visual Studio
//将产生一个编译时错误.
private void Button4_Click(object sender, System.EventArgs e)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) {
//创建一个圆
CirCle myCircle=new CirCle();
myCircle.Radius =2;
myCircle.Center(10,2);
//创建一个球体
Sphere mySphere=new Sphere();
mySphere.Radius =10;
mySphere.Center(10,20,25) ;
//显示每一种形状的相关信息
ShowShapeInfo(mySphere);
ShowShapeInfo(myCircle);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
private void ShowShapeInfo(IFigure Shape)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) {
//因为Shape参数是IFigure,我们知道它有这些成员
Response.Write("Shape Top :"+Shape.Top +"<br>" ) ;
Response.Write(" Left :"+Shape.Left +"<br>" ) ;
Response.Write(" Area : "+Shape.Area()+ "<br>" ) ;
Response.Write(" perimeter : "+Shape.Perimeter() +"<br>" ) ;
![](/Images/OutliningIndicators/InBlock.gif)
}
} //输出 Shape Top :0 Left :10 Area : 1256.637 perimeter : 62.83186 Shape Top :8 Left :0 Area : 25.13274 perimeter : 12.56637
![](/Images/OutliningIndicators/None.gif)
|