我使用字段创建class A
:
public var button1:Button;
public var button2:Button;
class B extends class A
并且只有字段
public var button1:Button;
我创建了一个这样的对象:
var but:A = new B();
然后我把它放在代码中:
but.button1.someproperty = ...
真正提到哪个按钮? button1是A类中的按钮或B类中的button1?
答案 0 :(得分:1)
不允许覆盖变量。如果public var button1:Button;
已经拥有该名称的变量,则无法在class B extends class A
中定义class A
。它应该是编译错误。
摘自Adobe的教程:
使用var或const关键字声明的属性是继承的,但不能被覆盖。覆盖属性意味着重新定义子类中的属性。可以覆盖的唯一属性类型是方法 - 即使用function关键字声明的属性。虽然您无法覆盖实例变量,但您可以通过为实例变量创建getter和setter方法并覆盖方法来实现类似的功能。
了解更多read here。
答案 1 :(得分:0)
变量but
属于A
类型,但包含B
类型的实例,它是A
的子类型(因此与变量兼容) 。所以最后,它指向B
的一个实例;所以你的button1
将是B的。
请注意,B
也有一个button1,因为它在A
中定义(但它仍然属于B
。)
最后,您无法真正执行此操作,因为无法覆盖字段,因此您无法在button1
中再次定义B
(因为它已在A
中定义) 。显示扩展类型的效果的更好示例将是这样的:
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();