关键字'this'(Me)无法调用基础构造函数

时间:2010-03-15 10:35:28

标签: c# .net vb.net oop

在继承的类中,我使用了基本构造函数,但我不能使用调用此基本构造函数的类成员。

在这个例子中,我有一张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 个答案:

答案 0 :(得分:5)

这个错误确实很有意义。

如果允许您以这种方式使用this,则会出现计时问题。您期望LabelColor具有什么价值(即,何时初始化)? TypedLabel的构造函数尚未运行。

答案 1 :(得分:2)

您正在尝试访问尚未初始化的成员。 this.LabelColor调用不可用的基类成员:当你编写: base(...)时,你还没有调用基类构造函数

 public TypedLabel(LabelType type)
        : base()
    {
        pb.Image = GetImageFromType(type, this.LabelColor);
    }

答案 2 :(得分:1)

我认为作为一种解决方法,我将按如下方式实现:

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

EDITED:我为此上下文设置了Private属性,但它也可以是public。实际上,您可以将Type和LabelColour设为公共,每当用户更改任何这些属性时,您可以重新创建图像并将其设置为基类,以便始终保证在图片框中使用代表性图像

答案 3 :(得分:0)

属性LabelColor目前尚未初始化,因此它将为null。实际上,“this”在那个时刻并没有被初始化,因为基本构造函数在初始化“this”之前被调用,这就是为什么不能调用“this”。