In the inherited class I use the base constructor, but I can’t use the class’s members calling this base constructor.
In this example I have a PicturedLabel that knows its own color and has an image. A TypedLabel : PictureLabel knows its type but uses the base color.
The (base) image that uses TypedLabel should be colored with the (base)color, however, I can’t obtain this color
Error: Keyword ‘this’ is not available in the current context`
A workaround?
/// 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;
}
}
I think as a workaround I will implement this as below:
EDITED: I make the Type property private for this context, but it can also be public. In fact you can make Type and LabelColour public and whenever user change any of these properties, you can recreate the image and set it to your base class so that you can always guarantee a representative image is used in the picture box