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