实验6 继承与多态
1简单几何图形描述
实验题目:
  根据几何图形的组合与继承关系定义用于描述点、直线、三角形、四边形、正方形、圆等几何图形的类(或结构)。要求首先定义一个几何图形接口描述所有几何图形的共有特性,上述几何图形都必须现实该接口,并且其中用于描述点的类型最好定义为结构。
  实验目的:
1) 理解组合与继承的概念,掌握组合与继承的语法。
2) 学会定义和使用派生类。
3) 学会定义和使用接口。
4) 掌握继承过程中的方法重写,区分它与方法隐藏、方法重载的不同。
5) 掌握引用类型之间的转换规则。
6) 掌握多态与动态绑定。
7) 熟悉关键字base
8) 学会定义密封方法。
实验步骤:
1) 定义几何图形接口ShapeShape接口中包含属性Color,用于读取和设置几何图形的颜;包含方法DrawEraseMove,用于绘制、擦拭、移动几何图形。由于属性Color的类型无法用基本数据类型准确描述,程序中还需要另外定义一个表示颜的枚举类型CColor(实际上,.NET框架类库中定义有一个Color结构,它可以更好地表示颜,你们可以直接使用它)。
2) 定义点结构Point实现Shape接口。Point结构中除实现Shape接口的所有成员外,还必须包含两个int型私有字段xy及相应属性,它们用于表示点的坐标。另外,还应为Point结构定义构造函数,并重写方法ToString
3) 定义直线类Line实现Shape接口。Line类中除实现Shape接口的所有成员外,还必须包含两个Point型私有字段point1point2及相应属性,它们用于表示直线两个顶点的坐标。另外,还应为Line类定义构造函数,并重写方法ToString
4) 定义三角形类Triange实现Shape接口。Triangle类中除实现Shape接口的所有成员外,还必须包含三个Point型私有字段及相应属性,它们用于表示三角形三个顶点的坐标。另外,还应为triangle类定义方法Area(求面积)和构造函数,并重写方法ToString
5) 定义四边形类Quadrilateral实现Shape接口。Quadrilateral类中除实现Shape接口中的所有成员外,还必须包含四个Point型私有字段及相应属性,它们用于表示四边形四个顶点的坐标。另外,还应为Quadrilateral类定义方法Area(求面积)和构造函数,并重写方法ToString。由于程序后面还需要在Quadrilateral类的基础上派生出正方形类,因此,实现Shape接口时,应该将方法DrawEraseMove声明为虚拟的,另外,重写方法ToString时,不妨将它声明为密封的。
6) 定义圆类Circle实现Shape接口。Circle类中除实现Shape接口的所有成员外,还必须包含一个Point型私有字段、一个int型私有字段及相应属性,它们分别用于表示圆的圆心坐
标及半径;另外,还应为Circle类定义Area(求面积)和构造函数,并重写方法ToString
7) 定义正方形类Square继承Quadrilateral类。Square类中应重写方法DrawEraseMove并定义构造函数。
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#接口应注意几个问题:
  1C#中的接口是独立于类来定义的。这与 C++模型是对立的,在 C++中接口实际上就是抽象基类。
  2、接口和类都可以继承多个接口。
  3、类可以继承一个基类,接口根本不能继承类。C#的简化接口模型有助于加快应用程序的开发。
  4、一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。
  5、接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,而你只能可以从仅有的一个类派生。
  接口是解决C# 类不能同时继承多个基类的解决方法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。