Я скачал сценарий из Интернета, и он отлично работает. Я начал адаптировать код для нового приложения. Но я получаю следующую ошибку: 1061: вызов, возможно, неопределенного метода drawShape через ссылку со статическим типом Class.

Глядя на код, я вижу, что метод, вызывающий drawShape, является статическим методом, вызывающим его как таковой: ShapeDrawer.drawShape (); Обратите внимание, что класс ShapeDrawer вообще не импортируется.

Тогда метод drawShape выглядит так: внутренняя функция drawShape () Кто-нибудь может мне объяснить, почему он может работать в загруженном мной приложении, а не в моем. Он был построен для использования с flash player 9, а мой - десять, что может сыграть свою роль.

Вот как это выглядит:

package puzzle
{
    import flash.geom.Point;    
    import utils.MyMath;

    public class PuzzleCaculater
    {
        public static function combineTwoPieces(pieceA:PuzzlePiece , pieceB:PuzzlePiece):void
        {
            for each(var drawingPiece in pieceB.unionPieces)
            {
                ShapeDrawer.drawShape(pieceA.graphicLayer , drawingPiece.shapeData , true);
                drawingPiece.disactive();
                drawingPiece.myGroup = pieceA.myGroup;
                drawingPiece.graphicLayer = pieceA.graphicLayer;
                pieceA.unionPieces.push(drawingPiece);
                drawingPiece.unionPieces = pieceA.unionPieces;
            }
        }
    }
}

package puzzle
{
    public class ShapeDrawer
    {
        internal function drawShape(target:Shape , drawingShapedata:Object , useBitmap:Boolean = true):void
        {
            var leftShape:Array= drawingShapedata.leftShape;
            var topShape:Array= drawingShapedata.topShape;
            var rightShape:Array= drawingShapedata.rightShape;
            var bottomShape:Array= drawingShapedata.bottomShape;
            var shapes:Array= [];
            shapes.push(leftShape);
            shapes.push(topShape);
            shapes.push(rightShape);
            shapes.push(bottomShape);
        }
    }
}
0
brenjt 29 Мар 2011 в 18:16
Правильное ли написание PuzzleCaculater?
 – 
Sam
29 Мар 2011 в 21:02
Это явно написано неправильно, но так написано в сценарии. Я проверил это пару раз.
 – 
brenjt
29 Мар 2011 в 21:05
Общедоступен ли исходный сценарий? Если да, то можно ссылку?
 – 
Sam
29 Мар 2011 в 21:08
Это не так, извините. Это был платный сценарий, поэтому я не думаю, что у меня есть возможность опубликовать его. Я пытался связаться с автором по поводу проблемы, но не получил ответа
 – 
brenjt
29 Мар 2011 в 21:13
Итак, независимо от того, почему он работал в оригинале, можете ли вы заставить его работать в своей версии, если вы установите для drawShape значение static internal?
 – 
Sam
29 Мар 2011 в 21:18

3 ответа

Лучший ответ

Вы определяете drawShape следующим образом:

internal function drawShape(...)

И вы должны определить это так:

static internal function drawShape(...)

Это решит вашу проблему, ключевое слово internal не проблема (потому что оба класса находятся в одном пакете)

1
Lucas Gabriel Sánchez 29 Мар 2011 в 20:16
Мой главный вопрос или беспокойство заключается в том, почему он будет работать с исходным сценарием, который я загрузил, но когда я копирую точный код в свое приложение.
 – 
brenjt
29 Мар 2011 в 20:26
Я не знаю разницы между двумя версиями, возможно, если вы покажете нам оба кода, мы сможем сказать вам, почему работает в одной и нет в другой.
 – 
Lucas Gabriel Sánchez
29 Мар 2011 в 20:34
Код, который я вставил выше, является точным кодом обоих. Я просто скопировал и вставил его в свое приложение.
 – 
brenjt
29 Мар 2011 в 20:40
Что ж, в этом случае я должен сказать вам, что ни один из кодов не работает, возможно, там, где вы его копируете, они забывают ввести ключевое слово static. Или, может быть (я в этом сомневаюсь) они вызывают функцию экземпляром, например: new ShapeDrawer().drawShape(...)
 – 
Lucas Gabriel Sánchez
29 Мар 2011 в 21:33
Да, я так и думал, но пока что нет таких примеров. Я собираюсь и дальше связываться с автором. Потому что в этом нет смысла. Я добавил статическое ключевое слово, и оно вызвало много других ошибок.
 – 
brenjt
29 Мар 2011 в 21:45

Ключевое слово internal предотвратит вызов этой функции вне пакета. Попробуйте сделать его общедоступным и посмотрите, исправит ли это его.

0
Sam 29 Мар 2011 в 18:36
Как ни странно, приложение, которое я скачал, и так работает отлично. Я хочу знать почему.
 – 
brenjt
29 Мар 2011 в 18:48
Вы создаете собственные классы для своего приложения? Я предполагаю, что в верхней части загруженных вами классов есть такая строка: package com.something Если вашего класса нет в пакете com.something, он не сможет получить доступ к методу. Вы можете либо изменить метод на общедоступный, либо добавить свои классы в существующий пакет.
 – 
Sam
29 Мар 2011 в 19:05
Да, они оба в одной упаковке. Вот что у меня взорвало. Есть и другие функции, которые вызываются таким же образом, и только эта функция не выдает ошибку. Это действительно странно.
 – 
brenjt
29 Мар 2011 в 19:19
Подождите, действительно ли drawShape () статический метод?
 – 
Sam
29 Мар 2011 в 19:46
Объявление его общедоступным не помогло. Имейте в виду, что в загруженном мной коде (который работает) класс не создается. Он вызывается как статичный.
 – 
brenjt
29 Мар 2011 в 19:46

Ознакомьтесь с модификаторами доступа. Они критически важны для шаблонов объектно-ориентированного проектирования в AS3 (и других объектно-ориентированных языках), и их неправильное понимание вызовет проблемы;)

Внутренний: внутренние методы или свойства создаются для совместного использования в общем пакете. Вам не нужно расширять или наследовать классы, имеющие внутренние члены (где, как мы наследуем в случае protected) для доступа к ним. Внутренние члены / методы похожи на общедоступные для классов, находящихся в одном пакете.

Объявление этого метода общедоступным, скорее всего, исправит вашу проблему ... Ура!

0
Bosworth99 29 Мар 2011 в 18:42
Да, я понимаю, что они делают. Вызываются аналогичные функции, и они не вызывают ошибки. Все классы находятся в одном пакете, что делает его еще более странным.
 – 
brenjt
29 Мар 2011 в 19:28
Объявление его общедоступным не помогло. Имейте в виду, что в загруженном мной коде (который работает) класс не создается. Он вызывается как статичный.
 – 
brenjt
29 Мар 2011 в 19:33
Я вижу это. Определенно называется статическим. И вы говорите, что этот код работает?
 – 
Bosworth99
29 Мар 2011 в 22:21