Ключевое слово 'this' (Me) недоступно, вызывая базовый конструктор - PullRequest
4 голосов
/ 15 марта 2010

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

В этом примере у меня есть PicturedLabel, который знает свой собственный цвет и имеет изображение. TypedLabel : PictureLabel знает свой тип, но использует базовый цвет.

(базовое) изображение, использующее TypedLabel, должно быть окрашено в (базовый) цвет, однако я не могу получить этот цвет

Ошибка: ключевое слово 'this' недоступно в текущем контексте`

Обходной путь?

/// base class
public class PicturedLabel : Label
{
    PictureBox pb = new PictureBox();
    public Color LabelColor;

    public PicturedLabel()
    {
        // initialised here in a specific way
        LabelColor = Color.Red;
    }

    public PicturedLabel(Image img)
        : base()
    {
        pb.Image = img;
        this.Controls.Add(pb);
    }
}

public enum LabelType { A, B }

/// derived class
public class TypedLabel : PicturedLabel
{
    public TypedLabel(LabelType type)
        : base(GetImageFromType(type, this.LabelColor))
    //Error: Keyword 'this' is not available in the current context
    {
    }

    public static Image GetImageFromType(LabelType type, Color c)
    {
        Image result = new Bitmap(10, 10);
        Rectangle rec = new Rectangle(0, 0, 10, 10);
        Pen pen = new Pen(c);
        Graphics g = Graphics.FromImage(result);
        switch (type) {
            case LabelType.A: g.DrawRectangle(pen, rec); break;
            case LabelType.B: g.DrawEllipse(pen, rec); break;
        }
        return result;
    }
}

Ответы [ 4 ]

5 голосов
/ 15 марта 2010

Эта ошибка имеет большой смысл.

Если вам разрешат использовать this таким образом, возникнет проблема синхронизации. Какое значение вы ожидаете иметь LabelColor (то есть, когда он инициализируется)? Конструктор для TypedLabel еще не запущен.

2 голосов
/ 15 марта 2010

Вы пытаетесь получить доступ к участнику, который еще не инициализирован. this.LabelColor вызывает члена базового класса, который недоступен: вы еще не вызывали конструктор базового класса, когда пишете : base(...)

 public TypedLabel(LabelType type)
        : base()
    {
        pb.Image = GetImageFromType(type, this.LabelColor);
    }
1 голос
/ 15 марта 2010

Я думаю, что в качестве обходного пути я реализую это, как показано ниже:

public class PicturedLabel : Label
{
    protected Image
    {
        get {...}
        set {...}
    }
    ............
}

public class TypedLabel : PicturedLabel
{
    public TypedLabel(LabelType type)
       :base(...)
    {
       Type = type;
    }
    private LabelType Type
    {
      set 
      {
         Image = GetImageFromType(value, LabelColor);
      }
    }
}

РЕДАКТИРОВАНИЕ: Я делаю свойство Type частным для этого контекста, но оно также может быть общедоступным. Фактически вы можете сделать Type и LabelColour общедоступными, и всякий раз, когда пользователь изменяет любое из этих свойств, вы можете воссоздать изображение и установить его в свой базовый класс, чтобы вы всегда могли гарантировать, что репрезентативное изображение используется в графическом окне

0 голосов
/ 15 марта 2010

Свойство LabelColor в данный момент не инициализируется, поэтому оно будет иметь значение null. Фактически, «this» не инициализируется в этот момент, потому что базовый конструктор вызывается перед инициализацией «this», поэтому вызов «this» не может быть выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...