覆盖属性&继承问题

时间:2015-03-26 08:04:26

标签: inheritance properties d override

我没有对我的任何模块进行重大更改,但突然间它开始无法编译我的很多模块。

我收到以下错误

borders.d(190): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()
borders.d(191): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\image.d(117): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\image.d(121): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\image.d(121): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\imagebutton.d(45): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\imagebutton.d(59): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\imagebutton.d(73): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\imagebutton.d(89): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\imagebutton.d(100): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\imagebutton.d(110): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()
controls\labelbutton.d(78): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\labelbutton.d(89): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\textbox.d(245): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()
controls\textbox.d(247): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()
controls\textbox.d(259): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()
controls\textbox.d(309): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\textbox.d(310): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()
controls\textbox.d(324): Error: function aeri.context.Context.size (Point newSize) is not callable using argument types ()
controls\textbox.d(325): Error: function aeri.context.Context.position (Point newPosition) is not callable using argument types ()

只是为了展示导致它的原因的一个例子。以下是borders.d

的代码段
this(Context parent, Paint topPaint, Paint rightPaint, Paint bottomPaint, Paint leftPaint) {
    super();

    if (!parent)
        throw new BorderException("Pass a context to render the border around.");

    m_parent = parent;
    m_topPaint = topPaint;
    m_rightPaint = rightPaint;
    m_bottomPaint = bottomPaint;
    m_leftPaint = leftPaint;

    position = parent.position; // Line 190
    size = parent.size; // Line 191
}

现在让我们看一下Context.positionContext.size

override void size(Point newSize) {
        super.size = newSize;

        if (m_backgroundPaint != transparent) {
            m_backgroundShape = new RectangleShape(Vector2f(cast(float)super.width, cast(float)super.height));
            m_backgroundShape.fillColor = m_backgroundPaint.toSfmlColor();
            m_backgroundShape.position = Vector2f(cast(float)super.x, cast(float)super.y);
        }
        if (m_border) {
            m_border.size = Point(super.size);
        }
    }

    override void position(Point newPosition) {
        super.position = newPosition;

        if (m_backgroundShape) {
            m_backgroundShape.position = Vector2f(cast(float)super.x, cast(float)super.y);
        }
        if (m_border) {
            m_border.position = Point(super.position);
        }
    }

那些是制定者。 Context继承了一个名为Space的类,它具有位置和大小的getter / setter。 Context仅覆盖setter,但getter是相同的,应该从Space调用。似乎甚至根本没有得到Space的属性。正如你所看到的那样,当它应该得到吸气剂时它试图获得设定者。但是所有这些代码都可以使用。

以下是Space中的属性。

    Point position() { return m_position; }

    void position(Point newPos) {
        m_position = newPos;
    }

    Point size() { return m_size; }

    void size(Point newSize) {
        m_size = newSize;
    }

注意:我会将以下所有属性包装起来,以防万一你想知道找不到@property的原因。

@property {
    // properties
}

我真的无法弄清楚是什么原因导致这种情况导致我认为它与编译器分析模块的顺序有关?

我仍在尝试自己解决这个问题,但是我无法发现错误,在Space更改了一些行后,它们似乎都破了,但是没有成员。

如果您想知道image.d中的错误,imagebutton.dlabelbutton.dtextbox.d是由同一件事造成的。它们都继承Context并覆盖大小/位置。 所以继承基本上是这样的:

x (ex. Image, ImageButton, LabelButton, TextBox etc.)
----Control
--------Context
------------Space

LabelButtonImageButton继承了继承Button的{​​{1}}。 Control不会覆盖任何来自Control的成员,因此对Context的所有来电都会直接转到ControlContext也是如此,除了它有一些用于处理鼠标事件的内部成员(在Button中处理,但它会调用它。)

以下是Context类和Control类,以防万一。

Button

class Control : Context { protected: this(string name) { super(name); } }

...

如果您需要更多信息或代码,请与我们联系。不过我认为这应该足够了。属性/属性调用的继承和覆盖在之前工作得很好。

1 个答案:

答案 0 :(得分:0)

解决了这个问题,它似乎是一个编译器错误(或者至少它似乎不是一个正常的行为。)

我在position/size内覆盖了来自Space的{​​{1}}的设置者,因此编译器从不在Context中寻找吸气剂,而是在Space中寻找吸气剂

我要解决的问题是在Context内覆盖了来自position/size的{​​{1}}的getter。