Наследование классов и полиморфизм - рисование простых фигур - PullRequest
3 голосов
/ 23 июля 2010

Я могу нарисовать круг, но не могу нарисовать прямоугольник или нарисовать линию.Ребята, вы видите, что мне не хватает?

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;
            }
        }
    }
}

Ответы [ 4 ]

2 голосов
/ 23 июля 2010

Измените ваши классы так:

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);
    }
}
1 голос
/ 23 июля 2010

Хорошо, ответ Франци верен, но это еще не все.

Вам нужен статический Shape, которому вы либо назначаете Circle, либо Square.Затем вы всегда рисуете Shape, который использует полиморфизм для определения формы для рисования.

Весь смысл полиморфизма в том, что вам не нужен этот регистр / выбор.

0 голосов
/ 23 июля 2010
  1. Вы реализуете каждую фигуру в своем классе Circle. Почему? Страница показалась смешной. Почему вы рисуете прямоугольник в c.drawShaper (g)? Вы смешали это с вашим классом Rectangle?
  2. Вы рисуете эллипс с помощью r.drawShape (g). Вам следует вызвать r.drawShaper (g). Почему у вас есть оба метода?
  3. Вы не реализовали рисование линии.
0 голосов
/ 23 июля 2010

Ваш метод drawShape для Rectangle рисует эллипс.Кроме того, ваш код "нарисовать линию" пуст:

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