Inheritance 在Actionscript中继承实例变量

Inheritance 在Actionscript中继承实例变量,inheritance,actionscript,Inheritance,Actionscript,我使用以下字段创建A类: public var button1:Button; public var button2:Button; 类别B扩展了类别A,并且只有字段 public var button1:Button; 我创建的对象如下所示: var but:A = new B(); public class A { public function test() : void { trace('test() in A!'); } } public

我使用以下字段创建
A类

public var button1:Button;
public var button2:Button;
类别B扩展了类别A
,并且只有字段

public var button1:Button;
我创建的对象如下所示:

var but:A = new B();
public class A
{
    public function test() : void
    {
        trace('test() in A!');
    }
}
public class B extends A
{
    public function test() : void
    {
        trace('test() in B!');
    }
}

var x:A = new B();
x.test();
然后我把它写进代码:

but.button1.someproperty = ...

哪个按钮是真的被引用的?button1是A类按钮还是B类按钮?

不允许重写变量。不能定义
公共变量按钮1:按钮类A
已经有一个同名变量,则类B中的code>扩展了类A。这应该是一个编译错误

Adobe教程摘录:

使用var或const关键字声明的属性是继承的,但不能被重写。重写属性意味着在子类中重新定义属性。唯一可以重写的属性类型是方法,即使用function关键字声明的属性。尽管不能重写实例变量,但可以通过为实例变量创建getter和setter方法并重写这些方法来实现类似的功能


更多信息。

变量
属于
A
类型,但包含
B
类型的实例,该类型是
A
的子类型(因此与变量兼容)。最后,它指向
B
的一个实例;所以你的
按钮1
应该是B

请注意,
B
也有一个按钮1,正如在
a
中定义的那样(它仍然属于
B

但最终,您无法真正做到这一点,因为无法覆盖字段,因此无法在
B
中再次定义
按钮1
(正如在
A
中已经定义的那样)。显示扩展类型效果的更好示例如下:

var but:A = new B();
public class A
{
    public function test() : void
    {
        trace('test() in A!');
    }
}
public class B extends A
{
    public function test() : void
    {
        trace('test() in B!');
    }
}

var x:A = new B();
x.test();

谢谢可能在我的情况下是允许的,因为我也在使用flex。但我不确定,我是新手!这永远不会是你的案子,我的案子,是Adobe的案子。阅读文档,您一定会得到编译错误!好啊经过一些测试,我写下了你的答案!!是的,我也阅读了文档;)你所举的例子与所问的问题不符。这个例子适用于方法重写,但变量重写在Actionscript中是非法的。@NoobUnChained请阅读我的第三段,我知道这一点。我把这个问题理解为关于多态性的一般性问题,只是用一个糟糕的例子(由于语法无效)来指出这个问题。因此,更好的示例显示了重写是如何工作的。