Просмотр полной версии : Проблема с 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: не понял.
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)
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)
и никакой ошибки не будет.
в таком случае мы в классе 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, а почему выходит такая ошибка: "Error #1063: Несоответствие количества аргументов в Rectangle().", если мы в подклассе объявили переменные, но не присвоили значение?
Она происходит не из-за этого, а из-за того, что где-то создается экземпляр класса Rectangle, и в него передается не такое количество аргументов.
Не видя всего кода сложно сказать наверняка.
public function Rectangle(xpoints, ypoints, width, height) // Нельзя ли этим параметрам значения присвоить позже?
Дык, — это же параметр (http://help.adobe.com/ru_RU/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html)! Как же можно параметру присвоить значения позже? Я про такое не слыхал.
Ну, можно в теле этой же функции, как и любой другой переменной
Только особого смысла не вижу. Я такой подход использую только при работе с бокс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.
Ну, можно в теле этой же функции, как и любой другой переменной
Параметр не переменная. Параметр первичен относительно переменной и неосязаем. Локальной переменной присваивается значения Параметра, только тогда мы можем уловить свечение его ауры. Аминь.
Компилируя в Flash IDE, выдает ту же самую ошибку: ArgumentError: Error #1063: Несоответствие количества аргументов в ColoredBall(). Ожидалось 2, получено 0.
В основной класс приложения не передаются параметры, значит, он не должен ожидать ни одного аргумента.
Локальной переменной присваивается значения Параметра, только тогда мы можем уловить
свечение его ауры. Аминь.
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
}
}
Никаких локальных переменных введенных компилятором не наблюдается
Хотя может мы говорим о разных вещах, хз
Ну да, о разных. В примере, локальной переменной присвоено значение 5.0. А Параметром передали 20.0, например. Сначала переменная someParam приняла значение Параметра (20.0), а потом — заданное значение 5.0. Разница должна ощущаться невооруженным глазом.
а как может быть объявлена переменная без слова var в этом случае?
Что-то я уже сам не догоняю
Добавлено через 6 минут
хотя я понял о чем ты
В составе определения метода, конечно. Компилятор, встречая определение метода, создает локальные переменные, перечисленные в его аргументах. Параметр — это значение!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.