Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с super() (http://www.flasher.ru/forum/showthread.php?t=170210)

goldlider 20.10.2011 17:55

Проблема с super()
 
Приведу сокращенный вариант примеры из книги К.Мука гл. 25 стр. 706-716.

Код AS3:

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

Код AS3:

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

Код AS3:

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,
Код AS3:

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

в таком случае мы в классе Rectangle должны написать так?
Код AS3:

super(xpoints, ypoints)


dimarik 20.10.2011 18:40

Цитата:

Сообщение от goldlider (Сообщение 1040609)
2. Количество и тип переменных описанных в суперклассе должен содержать и подкласс?

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

goldlider 20.10.2011 19:10

Цитата:

Сообщение от dimarik (Сообщение 1040623)
Если вы имели ввиду количество и тип параметров конструктора суперкласса и подкласса, то — нет.

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

Код AS3:

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

Код AS3:

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().", если мы в подклассе объявили переменные, но не присвоили значение? Ведь можно же позже присвоить значение, т.е.
Код AS3:

public function Polygon(xpoints, ypoints)

Код AS3:

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

Цитата:

Сообщение от goldlider (Сообщение 1040653)
public function Rectangle(xpoints, ypoints, width, height) // Нельзя ли этим параметрам значения присвоить позже?

Дык, — это же параметр! Как же можно параметру присвоить значения позже? Я про такое не слыхал.

goodguy 20.10.2011 21:25

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

goldlider 20.10.2011 21:31

Цитата:

Сообщение от dimarik (Сообщение 1040660)
Дык, — это же параметр! Как же можно параметру присвоить значения позже? Я про такое не слыхал.

а почему нет.
Код AS3:

var rect:Rectangle = new Rectangle(0, 0, 50, 25)

Цитата:

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

Приведу похожий пример.
Код AS3:

package
{       
        import flash.display.Sprite;
 
        public class Ball extends Sprite
        {
                private var r;
 
                public function Ball(radius)
                {
                        r = radius;
                }
        }
}

Код AS3:

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

Цитата:

Сообщение от goodguy (Сообщение 1040661)
Ну, можно в теле этой же функции, как и любой другой переменной

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

Цитата:

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

goodguy 20.10.2011 22:03

Цитата:

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

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

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

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

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


Часовой пояс GMT +4, время: 01:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.