c# - 类继承与多态——绘制简单形状

标签 c# drawing polymorphism system.drawing

我会画圆,但不会画矩形或画线。你们能看出我缺少什么吗?

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Shapes
{
    public abstract class Shapes
    {
        // these shapes are defined with four coordinates
        protected int x1, y1, x2, y2;

        // this method initializes the coordinates
        public void setCoordinates(int x1, int y1, int x2, int y2)
        {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }

        // abstract method to draw the shape
        public abstract void drawShape(Graphics g);
        public abstract void drawShapes(Graphics g);

    } // end of Shapes

    // class Circle derives from Shapes
    public class Circle : Shapes
    {
        // no argument constructor
        public Circle()
        {
            setCoordinates(0, 0, 0, 0);
        }

        // constructor with four arguments
        public Circle(int a, int b, int w, int h)
        {
            setCoordinates(a, b, w, h);
        }

        public override void drawShape(Graphics g)
        {
            g.DrawEllipse(new Pen(Color.Green), x1, y1, x2, y2);
        }

        public override void drawShaper(Graphics q)
        {
            q.DrawRectangle(new Pen(Color.Green), x1, y1, x2, y2);
        }
    }

    public class Rectangle : Shapes
    {
        // no argument constructor
        public Rectangle()
        {
            setCoordinates(0, 0, 0, 0);
        }

        // constructor with four arguments
        public Rectangle(int a, int b, int w, int h)
        {
            setCoordinates(a, b, w, h);
        }

        public override void drawShape(Graphics g)
        {
            g.DrawEllipse(new Pen(Color.Green), x1, y1, x2, y2);
        }

        public override void drawShaper(Graphics q)
        {
            q.DrawRectangle(new Pen(Color.Green), x1, y1, x2, y2);
        }
    }

    // tests Shapes hierarchy
    public class TestShapes : Form
    {
        private static Circle c;
        private static int shape;

        private static Rectangle r;

        public static void Main()
        {
            // Here you can ask the user to enter the type and 
            // the coordinates for a shape
            shape = 1;
            c = new Circle(100, 100, 50, 50);

            r = new Rectangle(100, 100, 50, 50);

            // starts the application and makes the form visible
            Application.Run(new TestShapes());
        }
        // this method executes automatically and paints the form
        protected override void OnPaint(PaintEventArgs e)
        {
            // Get Graphics Object
            Graphics g = e.Graphics;

            // Draw text on the form
            g.DrawString("Testing C# inheritance!", new Font("Arial", 18),
new SolidBrush(Color.Blue), 5, 5);
            switch (shape)
            {
                case 1:
                    // draw a circle
                    c.drawShape(g);
                    break;

                case 2: 
                    r.drawShape(g);
                    // draw a rectangle
                    break;

                case 3:
                    // draw a line
                    break;
            }
        }
    }
}

最佳答案

像这样改变你的类:

public abstract class Shape
{
    // ...
    // abstract method to draw the shape
    public abstract void DrawShape(Graphics g);
} // end of Shape

// class Circle derives from Shape
public class Circle : Shape
{
    // ...
    public override void DrawShape(Graphics g)
    {
        g.DrawEllipse(new Pen(Color.Green), x1, y1, x2, y2);
    }
}

public class Rectangle : Shape
{
    // ...
    public override void DrawShape(Graphics g)
    {
        g.DrawRectangle(new Pen(Color.Green), x1, y1, x2, y2);
    }
}

关于c# - 类继承与多态——绘制简单形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3314154/

相关文章:

c# - 声明基类出错的类

c++ - 为什么以及何时使用多态性将基类指向 C++ 中的派生类

c# - 测试项目的不同 stylecop 规则

C# 4.0/EF - SQL Server Compact 不支持服务器生成的键和服务器生成的值

java - 使用Java绘图: Applying Borders/Outlines to Shapes

java - Android流畅的多点触控绘图

c# - 在这种情况下警告 CS3006 有效吗?

c# - 相同的 url 不同的环境 - 一个成功另一个失败并出现 SSL 错误

android - 在 Canvas 上绘制圆圈,使它们在不同设备上大小相等或至少相当

static - 我可以多态访问静态方法吗?