Просмотр полной версии : как вызвать сеттер суперкласса?
whiteRed
19.04.2007, 14:38
class First{
private var $num:Number;
public function get num():Number{
return $num;
}
public function set num(n:Number){
$num = n;
}
function First(n:Number){
num = n;
}
}
class Second extends First
{
function Second(n:Number){
super(n);
}
public function set num(n:Number){
trace("second");
super.num = n; //не работает
// super.num(n); //тоже не работает
}
}
А никак, кривая реализация сеттеров в AS2.
whiteRed
19.04.2007, 14:53
чьерт поберьи:mad:
Я их не наследовал никогда, но слышал о проблемах. Видимо, это одна из них.
А как вы поняли, что super.num = n не работает?
whiteRed
19.04.2007, 15:07
А как вы поняли, что super.num = n не работает?
var q1 = new First(45);
var q2 = new Second(54);
trace(q1.num); //45
trace(q2.num); //undefined
whiteRed
19.04.2007, 15:21
class Second extends First
{
function Second(n:Number){
super(n);
}
public function set num(n:Number){
$num = n;
}
}
его даже просто переопределить нельзя!!
class First {
private var n:Number;
function First(_n:Number){
__n = _n;
}
function set __n(i:Number):Void {
this.n = i;
}
function get __n():Number {
return this.n;
}
}
class Second extends First {
function Second(n:Number){
super();
__n = n;
}
function set __n(i:Number):Void {
this.n = i;
}
function get __n():Number {
return this.n;
}
}
var _l1:First = new First(10);
var _l2:Second = new Second(20);
trace(_l1.__n); // 10
trace(_l2.__n); // 20
have fun! :D
Ну копипастить описание сеттеров/геттеров каждый сможет :D
А что тогда нужно было?.. переопределить? так можно и переопределить или использовать из суперкласса?
Если использовать из суперкласса - просто закоменть сет\гет во втором классе, все будет работать точно так же, если изменить, ну так измени =)
просто super() не принимает никаких параметров, если я ничего не путаю.
whiteRed
19.04.2007, 15:49
var q1:First = new First(45);
var q2:Second = new Second(54);
насколько я понял, проблема в этих строчках! нужно явно определять класс переменной, тогда все работает.
whiteRed
19.04.2007, 15:51
просто super() не принимает никаких параметров, если я ничего не путаю.
супер принимает те же параметры, что и конструктор суперкласса. но проблема не в нем
Так, либо я не понял, либо работает:
/**
* @author Denis Kolyako
*/
class TestClass {
private var $num:Number;
public function TestClass() {
this.$num = 10;
}
public function set num(value:Number):Void {
this.$num = value;
}
public function get num():Number {
return $num;
}
}
/**
* @author Denis Kolyako
*/
class ExtendedTestClass extends TestClass {
public function ExtendedTestClass() {
super();
}
public function set num(value:Number):Void {
super.num = value;
}
public function get num():Number {
return super.num;
}
}
a = new ExtendedTestClass();
trace(a.num); // 10
a.num = 2;
trace(a.num); // 2
whiteRed
19.04.2007, 15:58
вот, применительно к классам из первого поста:
var q1:First = new First(11);
var q2:Second = new Second(22);
trace(q1.num);//11
trace(q2.num);//22
var arr:Array = new Array();
arr.push(new First(11));
arr.push(new Second(22));
trace(arr[0].num);//11
trace(arr[1].num);//undefined
супер принимает те же параметры, что и конструктор суперкласса. но проблема не в нем
аха, но тебе ничего передавать ему не нужно.
----------------------- upd -----------------------
var _l1:First = new First(10);
var _l2:Second = new Second(20);
trace(_l1.__n); // 10
trace(_l2.__n); // 20
var __arr:Array = [];
__arr.push(new First(15));
__arr.push(new Second(25));
trace(__arr[0].__n); // 15
trace(__arr[1].__n); // 25
У меня все работает и с закомментированными сет\гет во втором классе и нет
Я так и не понял. Что в итоге должно получится (вне класса)?
А у меня работает:
/**
* @author Denis Kolyako
*/
class TestClass {
private var $num:Number;
public function TestClass(n:Number) {
this.num = n;
}
public function set num(value:Number):Void {
this.$num = value;
}
public function get num():Number {
return $num;
}
}
/**
* @author Denis Kolyako
*/
class ExtendedTestClass extends TestClass {
public function ExtendedTestClass(n:Number) {
super(n);
}
public function set num(value:Number):Void {
super.num = value;
}
public function get num():Number {
return super.num;
}
}
a = new TestClass(20);
b = new ExtendedTestClass(15);
c = [a,b];
trace([c[0].num,c[1].num]); // 20,15
Я так и не понял. Что в итоге должно получится (вне класса)?
Я так понял, что 2 разных объекта, с одинаковым свойством и одинаковым геттером, но разными сеттерами
whiteRed
19.04.2007, 16:12
Я так и не понял. Что в итоге должно получится (вне класса)?
должно получиться: мы переопределям сеттер (не важно, используя super или нет), и он должен работать, причем объекты второго класса хранятся не в переменных, для которых можно указать тип (var q2:Second = new Second(); в этом случае все работает), а в массиве (arr[1] = new Second(); так работать не хочет)
whiteRed
19.04.2007, 16:21
попробуйте во втором классе не упоминать про геттер, просто переопределить сеттер - тогда перестает работать
whiteRed
19.04.2007, 16:23
все, я для себя разобрался: если переопределяем сеттер, то переопределяем и геттер. поодиночке нельзя
----upd
точнее нельзя переопределять только сеттер
хм, и вправду не работает... но только если объект не поименован.
В AS3 будет работать. А в AS2 не работает в силу преобразований в AS1.
А как переопределить геттер типа _height (_width итп.)?
function get _height():Number{
trace ("blablabla");
return super._height;
}
не работает
terbooter
31.10.2007, 09:16
Если что то типа _height вашего производства, то выше написано как.
А если вы имеете ввиду своиство класса MovieClip, то своиство не бы вает геттерное или сеттерное
terbooter, вообще-то ширина и высота, да и вообще все свойства мувиклипа есть геттеры и сеттеры.
Насчет переопределния не скажу, есть какие-то проблемы с этим, да.
Если что то типа _height вашего производства, то выше написано как.
А если вы имеете ввиду своиство класса MovieClip, то своиство не бы вает геттерное или сеттерное
В том-то и проблема, что непонятно, как вызывать встроенные _height и _width, если переопределять их.
terbooter
31.10.2007, 11:44
охотно, соглашаюсь что свойства мувиклипа есть геттеры сеттеры.
Хочется знать откуда это следует, для повышения образованности
CrazyFlasher
31.10.2007, 12:04
а я вообще их не использую...они запутывают...лучше использоват обычные функции, которые присваивают (типа public function setVar(num:Number)) и возвращают (public function getVar():Number)
охотно, соглашаюсь что свойства мувиклипа есть геттеры сеттеры.
Хочется знать откуда это следует, для повышения образованности
Попробуй задать положительную ширину пустому клипу :-)
terbooter
31.10.2007, 13:22
Попробуй задать положительную ширину пустому клипу :-)
Получился ноль.
Примерно понял
Геттер возвращает ширину всех вложенных объектов, сеттер пытается установить ширину вложенных элементов, рекурсивно.
Поэтому это не свойства.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.