PDA

Просмотр полной версии : Проблема с super()


goldlider
20.10.2011, 17:55
Приведу сокращенный вариант примеры из книги К.Мука гл. 25 стр. 706-716.

package org.moock.drawing
{
public class BasicShape extends Shape
{
public function BasicShape()
{

}
}
}

package org.moock.drawing
{
public class Polygon extends BasicShape
{
public function Polygon(xpoints:Array = null, ypoints:Array = null)
{
super(); // Здесь все верно, т.к. конструктор класса BasicShape не имеет параметров
}
}
}

package org.moock.drawing
{
public class Rectangle extends Polygon
{
public function Rectangle(width:Number = 100, height:Number = 100)
{
super(); // Должно быть так super(xpoints, ypoints)
}
}
}


1. Почему у ключевого слова super() описанного в Rectangle отсутствуют аргументы?
2. Количество и тип переменных описанных в суперклассе должен содержать и подкласс?

Psycho Tiger
20.10.2011, 17:58
1. Почему у ключевого слова super() описанного в Rectangle отсутствуют аргументы?
Так захотелось.
Т.к.
public function Polygon(xpoints:Array = null, ypoints:Array = null)
то в качестве аргументов будет переданы дефолтные значения (null)

2: не понял.

ChuwY
20.10.2011, 18:00
1. У класса Polygon все параметры конструктора помечены как необязательные, со значениями по-умолчанию.

2. Все переменные описанные в суперклассе наследуются и попадают в производный класс.
Но обратиться из подкласса вы можете только к public и protected полям и методам.

goldlider
20.10.2011, 18:08
ChuwY,
public function Polygon(xpoints:Number = 20, ypoints:Number = 30)
в таком случае мы в классе Rectangle должны написать так?
super(xpoints, ypoints)

dimarik
20.10.2011, 18:40
2. Количество и тип переменных описанных в суперклассе должен содержать и подкласс?

Если вы имели ввиду количество и тип параметров конструктора суперкласса и подкласса, то — нет.

goldlider
20.10.2011, 19:10
Если вы имели ввиду количество и тип параметров конструктора суперкласса и подкласса, то — нет.
да я это имел ввиду.
Тогда исходя из ваших слов получается, что я могу без проблем написать вот так:

public function Polygon(xpoints:Number = 20, ypoints:Number = 30)

public function Rectangle(name:String = "Rect1", width:int = 100, height:Number = 100)
и никакой ошибки не будет.

goodguy
20.10.2011, 19:16
в таком случае мы в классе Rectangle должны написать так?
Конечно нет. Какие значения туда передадутся, такие и примет конструктор суперкласса.
переменные xpoints и ypoints не объявлены в подклассе, соответственно такая передача их в суперкласс приведет к ошибке
и никакой ошибки не будет.
Все верно. Никакой ошибки не будет.

goldlider
20.10.2011, 20:46
goodguy, а почему выходит такая ошибка: "Error #1063: Несоответствие количества аргументов в Rectangle().", если мы в подклассе объявили переменные, но не присвоили значение? Ведь можно же позже присвоить значение, т.е.
public function Polygon(xpoints, ypoints)
public function Rectangle(xpoints, ypoints, width, height) // Нельзя ли этим параметрам значения присвоить позже?
{
super(xpoints, ypoints);
}

goodguy
20.10.2011, 21:23
goodguy, а почему выходит такая ошибка: "Error #1063: Несоответствие количества аргументов в Rectangle().", если мы в подклассе объявили переменные, но не присвоили значение?
Она происходит не из-за этого, а из-за того, что где-то создается экземпляр класса Rectangle, и в него передается не такое количество аргументов.
Не видя всего кода сложно сказать наверняка.

dimarik
20.10.2011, 21:24
public function Rectangle(xpoints, ypoints, width, height) // Нельзя ли этим параметрам значения присвоить позже?

Дык, — это же параметр (http://help.adobe.com/ru_RU/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html)! Как же можно параметру присвоить значения позже? Я про такое не слыхал.

goodguy
20.10.2011, 21:25
Ну, можно в теле этой же функции, как и любой другой переменной
Только особого смысла не вижу. Я такой подход использую только при работе с бокс2д, когда в параметре передаю пиксели, а внутри функции они уже конвертируются в метры

goldlider
20.10.2011, 21:31
Дык, — это же параметр (http://help.adobe.com/ru_RU/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html)! Как же можно параметру присвоить значения позже? Я про такое не слыхал.

а почему нет.
var rect:Rectangle = new Rectangle(0, 0, 50, 25)

Она происходит не из-за этого, а из-за того, что где-то создается экземпляр класса Rectangle, и в него передается не такое количество аргументов.
Не видя всего кода сложно сказать наверняка.

Приведу похожий пример.
package
{
import flash.display.Sprite;

public class Ball extends Sprite
{
private var r;

public function Ball(radius)
{
r = radius;
}
}
}

package
{
public class ColoredBall extends Ball // Основной класс приложения
{
private var c;

public function ColoredBall(radius, color)
{
super(radius);
c = color;
}
}
}
Компилируя в Flash IDE, выдает ту же самую ошибку: ArgumentError: Error #1063: Несоответствие количества аргументов в ColoredBall(). Ожидалось 2, получено 0.

dimarik
20.10.2011, 21:44
Ну, можно в теле этой же функции, как и любой другой переменной

Параметр не переменная. Параметр первичен относительно переменной и неосязаем. Локальной переменной присваивается значения Параметра, только тогда мы можем уловить свечение его ауры. Аминь.

Компилируя в Flash IDE, выдает ту же самую ошибку: ArgumentError: Error #1063: Несоответствие количества аргументов в ColoredBall(). Ожидалось 2, получено 0.
В основной класс приложения не передаются параметры, значит, он не должен ожидать ни одного аргумента.

goodguy
20.10.2011, 22:03
Локальной переменной присваивается значения Параметра, только тогда мы можем уловить
свечение его ауры. Аминь.
dimarik, ты не прав =)
package {

public class Parameters{

public function Parameters(someParam:Number = 10) {
someParam = 5;
trace(someParam); // 5
}
}
}

Декомпил получившегося барахла:

package
{

public class Parameters extends Object
{

public function Parameters(someParam:Number = 10)
{
someParam = 5;
trace(someParam);
return;
}// end function

}
}

Никаких локальных переменных введенных компилятором не наблюдается

Хотя может мы говорим о разных вещах, хз

dimarik
20.10.2011, 22:19
Ну да, о разных. В примере, локальной переменной присвоено значение 5.0. А Параметром передали 20.0, например. Сначала переменная someParam приняла значение Параметра (20.0), а потом — заданное значение 5.0. Разница должна ощущаться невооруженным глазом.

goodguy
20.10.2011, 22:24
а как может быть объявлена переменная без слова var в этом случае?
Что-то я уже сам не догоняю

Добавлено через 6 минут
хотя я понял о чем ты

dimarik
20.10.2011, 22:32
В составе определения метода, конечно. Компилятор, встречая определение метода, создает локальные переменные, перечисленные в его аргументах. Параметр — это значение!