实验6 继承与多态
1简单几何图形描述
实验题目:
根据几何图形的组合与继承关系定义用于描述点、直线、三角形、四边形、正方形、圆等几何图形的类(或结构)。要求首先定义一个几何图形接口描述所有几何图形的共有特性,上述几何图形都必须现实该接口,并且其中用于描述点的类型最好定义为结构。
实验目的:
1) 理解组合与继承的概念,掌握组合与继承的语法。
2) 学会定义和使用派生类。
3) 学会定义和使用接口。
4) 掌握继承过程中的方法重写,区分它与方法隐藏、方法重载的不同。
5) 掌握引用类型之间的转换规则。
6) 掌握多态与动态绑定。
7) 熟悉关键字base。
8) 学会定义密封方法。
实验步骤:
1) 定义几何图形接口Shape。Shape接口中包含属性Color,用于读取和设置几何图形的颜;包含方法Draw、Erase、Move,用于绘制、擦拭、移动几何图形。由于属性Color的类型无法用基本数据类型准确描述,程序中还需要另外定义一个表示颜的枚举类型CColor(实际上,.NET框架类库中定义有一个Color结构,它可以更好地表示颜,你们可以直接使用它)。
2) 定义点结构Point实现Shape接口。Point结构中除实现Shape接口的所有成员外,还必须包含两个int型私有字段x、y及相应属性,它们用于表示点的坐标。另外,还应为Point结构定义构造函数,并重写方法ToString。
3) 定义直线类Line实现Shape接口。Line类中除实现Shape接口的所有成员外,还必须包含两个Point型私有字段point1、point2及相应属性,它们用于表示直线两个顶点的坐标。另外,还应为Line类定义构造函数,并重写方法ToString。
4) 定义三角形类Triange实现Shape接口。Triangle类中除实现Shape接口的所有成员外,还必须包含三个Point型私有字段及相应属性,它们用于表示三角形三个顶点的坐标。另外,还应为triangle类定义方法Area(求面积)和构造函数,并重写方法ToString。
5) 定义四边形类Quadrilateral实现Shape接口。Quadrilateral类中除实现Shape接口中的所有成员外,还必须包含四个Point型私有字段及相应属性,它们用于表示四边形四个顶点的坐标。另外,还应为Quadrilateral类定义方法Area(求面积)和构造函数,并重写方法ToString。由于程序后面还需要在Quadrilateral类的基础上派生出正方形类,因此,实现Shape接口时,应该将方法Draw、Erase、Move声明为虚拟的,另外,重写方法ToString时,不妨将它声明为密封的。
6) 定义圆类Circle实现Shape接口。Circle类中除实现Shape接口的所有成员外,还必须包含一个Point型私有字段、一个int型私有字段及相应属性,它们分别用于表示圆的圆心坐
标及半径;另外,还应为Circle类定义Area(求面积)和构造函数,并重写方法ToString。
7) 定义正方形类Square继承Quadrilateral类。Square类中应重写方法Draw、Erase、Move并定义构造函数。
8) 定义Main方法测试上面定义的类。
参考代码:
using System; //定义一个颜的枚举 enum CColor { BLACK, BLUE, BROWN, CYAN, GRAY, GREEN, ORANGE, PINK, RED, WHITE, YELLOW } //定义一个几何图形接口 interface Shape { CColor Color { get; set; } void Draw();//绘制的方法 void Erase();//擦拭的方法 void Move();//移动的方法 } //定义一个点的结构来实现Shape几何图形的接口 struct Point : Shape { private CColor color; private int x, y; public CColor Color { get { return color; } set { color = value; } } public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } public Point(){ } public Point(int x, int y) { this.x = x; this.y = y; this.color = CColor.RED; } public void Draw() { Console.WriteLine("绘制一个点"); } public void Erase() { Console.WriteLine("擦拭一个点"); } public void Move() { writeline函数Console.WriteLine("移动一个点"); } //重写ToString()方法 public override string ToString() { return "(" + x + "," + y + ")"; } } //定义一个直线的类来实现Shape接口 class Line : Shape { private CColor color; //顶点 private Point point1, point2; public CColor Color { get { return color; } set { color = value; } } public Point Point1 { get { return point1; } set { point1 = value; } } public Point Point2 { get { return point2; } set { point2 = value; } } public Line() { } public Line(Point p1, Point p2) { point1 = p1; point2 = p2; } public void Draw() { Console.WriteLine("绘制一条直线"); } public void Erase() { Console.WriteLine("擦拭一条直线"); } public void Move() { Console.WriteLine("移动一条直线"); } //也重写一下ToString方法 public override string ToString() { return "(" + point1.ToString() + "," + point2.ToString() + ")"; } } //定义一个三角形的类同时让它实现Shape接口 class Triangle : Shape { private CColor color; //定义三角形的三个顶点 private Point point1, point2, point3; public CColor Color { get { return color; } set { color = value; } } public Point Point1 { get { return point1; } set { point1 = value; } } public Point Point2 { get { return point2; } set { point2 = value; } } public Point Point3 { get { return point3; } set { point3 = value; } } public Triangle() { } public Triangle(Point p1, Point p2, Point p3) { point1 = p1; point2 = p2; point3 = p3; } public void Draw() { Console.WriteLine("绘制一个三角形"); } public void Erase() { Console.WriteLine("擦拭一个三角形"); } public void Move() { Console.WriteLine("移动一个三角形"); } //增加一个三角形自己的求面积的方法 public double Area() { double area = Math.Abs(point1.X * point2.Y + point2.X * point3.Y + point3.X * point1.Y- point1.X * point3.Y - point2.X * point1.Y - point3.X * point2.Y) / 2.0; return area; } //同样也重写一下ToString方法 public override string ToString() { return "(" + point1.ToString() + "," + point2.ToString() + "," + point3.ToString() + ")"; } } //定义一个四边形的类同样实现Shape接口 class Quadrilateral : Shape { private CColor color; //定义四边形的四个顶点 private Point point1, point2, point3, point4; public CColor Color { get { return color; } set { color = value; } } public Point Point1 { get { return point1; } set { point1 = value; } } public Point Point2 { get { return point2; } set { point2 = value; } } public Point Point3 { get { return point3; } set { point3 = value; } } public Point Point4 { get { return point4; } set { point4 = value; } } public Quadrilateral() { } public Quadrilateral(Point p1, Point p2, Point p3, Point p4) { point1 = p1; point2 = p2; point3 = p3; point4 = p4; } public virtual void Draw() { Console.WriteLine("绘制一个四边形"); } public virtual void Erase() { Console.WriteLine("擦拭一个四边形"); } public virtual void Move() { Console.WriteLine("移动一个四边形"); } //定义一个四边形求面积的方法 public double Area() { double area = Math.Abs(point1.X * point2.Y - point2.X * point1.Y + point2.X * point3.Y - point3.X + point2.Y + point3.X * point4.Y - point4.X * point3.Y + point4.X * point1.Y - point1.X * point4.Y) / 2.0; return area; } //重写ToString方法 public sealed override string ToString() { return "(" + point1.ToString() + "," + point2.ToString() + "," + point3.ToString() + "," + point4.ToString() + ")"; } } //定义一个圆的类同样让它实现Shape接口 class Circle : Shape { private CColor color; //定义一个圆心 private Point point; //定义圆的半径 private int radius; public CColor Color { get { return color; } set { color = value; } } public Point Point { get { return point; } set { point = value; } } public int Radius { get { return radius; } set { radius = value; } } public Circle() { } public Circle(Point p, int r) { point = p; radius = r; } public void Draw() { Console.WriteLine("绘制一个圆"); } public void Erase() { Console.WriteLine("擦拭一个圆"); } public void Move() { Console.WriteLine("移动一个圆"); } //定义一个方法求的面积 public double Area() { return Math.PI * radius * radius; } //同样重写ToString让它格式化字符串 public override string ToString() { return "(" + point.ToString() + "," + radius + ")"; } } //定义一个正方形的类,并且它让继承于四边形的类 class Square : Quadrilateral { public Square() { } public Square(Point p1, Point p2, Point p3, Point p4) : base(p1, p2, p3, p4) { } public override void Draw() { Console.WriteLine("绘制一个正方形"); } public override void Erase() { Console.WriteLine("擦拭一个正方形"); } public override void Move() { Console.WriteLine("移动一个正方形"); } } //定义一个类放入Main()方法 class Test { static void Main() { Point p1 = new Point(1, 1); Point p2 = new Point(1, 2); Point p3 = new Point(2, 2); Point p4 = new Point(2, 1); Shape line = new Line(p1, p2); Shape triangle = new Triangle(p1, p2, p3); Shape circle = new Circle(p1, 2); Shape square = new Square(p1, p2, p3, p4); Console.WriteLine("直线是{0}", line); line.Draw(); Console.WriteLine("三角形是{0}", triangle); triangle.Draw(); Console.WriteLine("三角形的面积是{0}", ((Triangle)triangle).Area()); Console.WriteLine("圆是{0}", circle); circle.Draw(); Console.WriteLine("圆的面积是{0}", ((Circle)circle).Area()); Console.WriteLine("正方形是{0}", square); square.Draw(); Console.WriteLine("正方形的面积是{0}", ((Square)square).Area()); line.Move(); circle.Erase(); Console.ReadLine(); } } |
运行结果如下图:
什么是接口?其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致。个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的。
注意:接口中只能包含方法、属性、索引器和事件的声明。不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。
实现某个接口的类或结构必须要实现接口中的所有声明的方法。要不然,编译就会出错。
总结起来说,使用C#接口应注意几个问题:
1、C#中的接口是独立于类来定义的。这与 C++模型是对立的,在 C++中接口实际上就是抽象基类。
2、接口和类都可以继承多个接口。
3、类可以继承一个基类,接口根本不能继承类。C#的简化接口模型有助于加快应用程序的开发。
4、一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。
5、接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。
接口是解决C#中 类不能同时继承多个基类的解决方法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论