C# 如何将winforms与抽象类一起使用

C# 如何将winforms与抽象类一起使用,c#,winforms,oop,abstract-class,factory,C#,Winforms,Oop,Abstract Class,Factory,我有一个抽象类“Element”,其实例必须使用System.Drawing中的函数DrawRectangle()。 问题是,由于类是抽象的,它无法从表单继承,因此程序无法识别这些类。。 我怎样才能解决这个问题? 我尝试在元素中放入一个Form类型的变量,但没有成功。 我也尝试了相反的方法,在表单中放入一个元素变量。 这是我第一次使用Winform和C#。。。 这应该是一个鼠标竞赛游戏,在页面中绘制的对象应该追逐鼠标或向其他方向移动,但我需要它是面向对象的 using System; using

我有一个抽象类“Element”,其实例必须使用System.Drawing中的函数DrawRectangle()。 问题是,由于类是抽象的,它无法从表单继承,因此程序无法识别这些类。。 我怎样才能解决这个问题? 我尝试在元素中放入一个Form类型的变量,但没有成功。 我也尝试了相反的方法,在表单中放入一个元素变量。 这是我第一次使用Winform和C#。。。 这应该是一个鼠标竞赛游戏,在页面中绘制的对象应该追逐鼠标或向其他方向移动,但我需要它是面向对象的

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace MyMouseGame
{
    public abstract class Element
    {
        //Form1 myForm = new Form1();// not sure I need it
        public enum EnumShape { Square, Circle, Triangle }
        public enum EnumType { Chase, Escape, Random }

        //variables
        private double X { get; set; }
        private double Y { get; set; }
        private int Size { get; }
        private int Speed { get; }
        private EnumShape Shape { get; set; }
        protected EnumType Type { get; set; }

        private static Random R = new Random();

        //methods

        public int generateRandomNum()
        {
            int randomNum = R.Next(20, 100);
            return randomNum;
        }

        public Element()
        {
            X= 0;
            Y = 0;
            Shape = 0;
            Size = generateRandomNum();
            Speed = generateRandomNum();
            Type = 0;
        }

        public void ElementsFactory()
        {

        }

        public void hitTarget(e) { }
        public abstract void Draw(Form1 g); //here I tried to pass a form inside 
        public abstract void Move();
    }
}


绘图程序需要两件事。图形对象,以及绘图区域的大小

例如,在图形区域的中心绘制圆

public void Draw(Graphics g, Size target)
{
    int diameter = 16;
    g.DrawEllipse(Pens.Black, target.Width/2 - diameter/2, target.Height/2 - diameter/2, diameter, diameter);
}
在窗体的绘制事件中,调用所有绘制函数

void panel1_Paint(object sender, PaintEventArgs e)
{
    foreach(var item in Elements)
    {
        item.Draw(e.Graphics, pictureBox1.ClientSize);
    }
}

Element
不需要是抽象的,是吗?我认为它需要是抽象的,因为它本身没有实现它的方法,但它的“child”是表单类不需要从
Element
继承的-它需要传递具体的实例才能绘制.g=panel1.CreateGraphics();绘制事件应使用e.Graphics参数。另外:如果您想要持久图形,请不要尝试缓存图形对象。-另外:
t.Tick+=neweventhandler(timer1\u Tick)这会在每次绘制调用时添加另一个勾号调用。当然不是你想要的。你说永远不要试图缓存图形对象是什么意思?另外:e.CreateGaphics()无法识别create graphics方法。怎么办?另外:如果我想要绘制不同的元素,我应该在不同的线程中绘制吗?谢谢
void panel1_Paint(object sender, PaintEventArgs e)
{
    foreach(var item in Elements)
    {
        item.Draw(e.Graphics, pictureBox1.ClientSize);
    }
}