Вход

Просмотр полной версии : как вызвать сеттер суперкласса?


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); //тоже не работает

}

}

etc
19.04.2007, 14:51
А никак, кривая реализация сеттеров в AS2.

whiteRed
19.04.2007, 14:53
чьерт поберьи:mad:

etc
19.04.2007, 14:56
Я их не наследовал никогда, но слышал о проблемах. Видимо, это одна из них.

iNils
19.04.2007, 15:00
А как вы поняли, что 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;
}
}
его даже просто переопределить нельзя!!

wvxvw
19.04.2007, 15:22
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

etc
19.04.2007, 15:38
Ну копипастить описание сеттеров/геттеров каждый сможет :D

wvxvw
19.04.2007, 15:45
А что тогда нужно было?.. переопределить? так можно и переопределить или использовать из суперкласса?
Если использовать из суперкласса - просто закоменть сет\гет во втором классе, все будет работать точно так же, если изменить, ну так измени =)
просто 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() не принимает никаких параметров, если я ничего не путаю.

супер принимает те же параметры, что и конструктор суперкласса. но проблема не в нем

etc
19.04.2007, 15:54
Так, либо я не понял, либо работает:

/**
* @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

wvxvw
19.04.2007, 15:59
супер принимает те же параметры, что и конструктор суперкласса. но проблема не в нем
аха, но тебе ничего передавать ему не нужно.

----------------------- 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
У меня все работает и с закомментированными сет\гет во втором классе и нет

iNils
19.04.2007, 16:02
Я так и не понял. Что в итоге должно получится (вне класса)?

etc
19.04.2007, 16:03
А у меня работает:

/**
* @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

wvxvw
19.04.2007, 16:09
Я так и не понял. Что в итоге должно получится (вне класса)?
Я так понял, что 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
точнее нельзя переопределять только сеттер

wvxvw
19.04.2007, 16:28
хм, и вправду не работает... но только если объект не поименован.

etc
19.04.2007, 17:06
В AS3 будет работать. А в AS2 не работает в силу преобразований в AS1.

s8000_1
30.10.2007, 22:51
А как переопределить геттер типа _height (_width итп.)?


function get _height():Number{
trace ("blablabla");
return super._height;
}


не работает

terbooter
31.10.2007, 09:16
Если что то типа _height вашего производства, то выше написано как.
А если вы имеете ввиду своиство класса MovieClip, то своиство не бы вает геттерное или сеттерное

etc
31.10.2007, 10:20
terbooter, вообще-то ширина и высота, да и вообще все свойства мувиклипа есть геттеры и сеттеры.
Насчет переопределния не скажу, есть какие-то проблемы с этим, да.

s8000_1
31.10.2007, 11:41
Если что то типа _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)

etc
31.10.2007, 13:11
охотно, соглашаюсь что свойства мувиклипа есть геттеры сеттеры.
Хочется знать откуда это следует, для повышения образованности
Попробуй задать положительную ширину пустому клипу :-)

terbooter
31.10.2007, 13:22
Попробуй задать положительную ширину пустому клипу :-)
Получился ноль.
Примерно понял

etc
31.10.2007, 14:10
Геттер возвращает ширину всех вложенных объектов, сеттер пытается установить ширину вложенных элементов, рекурсивно.
Поэтому это не свойства.