Как исправить ошибку 'Дизайнер должен создать экземпляр типа "", но не может, потому что он помечен как абстрактный " - PullRequest
1 голос
/ 27 апреля 2019

Я всегда получаю ошибку. Дизайнер должен создать экземпляр типа «BaseFractal», но не может, потому что он помечен как абстрактный ». Ни одно из решений на Как заставить дизайнер Visual Studio 2008 Windows Forms визуализировать форму, которая реализует абстрактный базовый класс? работал

Есть ли другие решения для этой ошибки?

[System.ComponentModel.TypeDescriptionProvider 
(typeof(AbstractControlDescriptionProvider<BaseFractal, UserControl>))]
public abstract class BaseFractal : UserControl
{
    private Contour _Contour = new Contour() { color = Color.Black, weight = 1, indent = Indents.full };

    /// <summary>
    /// Sets or gets the contour fields
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    public Contour Contour
    {
        get { return _Contour; }
        set { _Contour = value; }
    }

    private int _Order = 0;

    /// <summary>
    /// Sets or gets the order of the fractal
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    public int Order
    {
        get { return _Order; }
        set { _Order = value; }
    }

    public BaseFractal()
    {
        InitializeComponent();
    }

    /// <summary>
    /// Create the path that needs to be drawn
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    protected abstract GraphicsPath CreatePath();

    /// <summary>
    /// Draw the fractals contour
    /// </summary>
    /// <remarks>
    /// TODO
    /// </remarks>
    protected void DrawFractal(PaintEventArgs e)
    {
        using (SolidBrush brush = new SolidBrush(Contour.color))
        {
            e.Graphics.FillPath(brush, CreatePath());
        }
    }

1 Ответ

1 голос
/ 27 апреля 2019

У дизайнера нет проблем с отображением абстрактного элемента управления в конструкторе. Проблема в том, что у вашего элемента управления есть абстрактный базовый класс.

Допустим, у вас есть абстрактный BaseControl в качестве базового класса для MyControl. Затем, когда вы пытаетесь увидеть BaseControl в конструкторе, это не проблема, но дизайнер не может показать MyControl.

Проблема заключается в том, что когда вы открываете MyControl в режиме конструктора, дизайнер пытается создать экземпляр базового класса, чтобы показать его в конструкторе, но поскольку базовый класс является абстрактным, он не может создать экземпляр и не может нагрузка.

В качестве варианта решения проблемы вы можете создать неабстрактный базовый класс, производный от базового элемента управления для режима отладки. Тогда дизайнер может показать MyControl.

Примечание: Использование #if DEBUG просто для того, чтобы избавиться от промежуточной неабстрактной базы при построении для RELEASE. Если вас это не волнует, вам не нужны эти директивы, и вы можете просто создать промежуточную неабстрактную базу и использовать ее.

namespace SampleWinApp
{
#if DEBUG
    public partial class MyControl : NonAbstractBase
#else
    public partial class MyControl : BaseControl
#endif
    {
        public MyControl()
        {
            InitializeComponent();
        }
    }
#if DEBUG
    public class NonAbstractBase : BaseControl { }
#endif
}

А вот мое резюме BaseControl:

namespace SampleWinApp
{
    public abstract partial class BaseControl : UserControl
    {
        public BaseControl()
        {
            InitializeComponent();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...