Использую общепринятый метод
Код AS3:
public static function clone(source:Object):*
{
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return copier.readObject();
}
для копирования объекта, и получаю
Цитата:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать Object@2db3b999 в MemberType.
at Main()
|
вот вызов
Код AS3:
var mt:MemberType = new MemberType(maxLength);
var copy:MemberType = Utils.clone(mt) as MemberType
И на всякий случай весь класс MemberType, хотя я думаю что данных было бы достаточно
Код AS3:
package
{
/**
* ...
* @author XDiaBLo
*/
public class MemberType
{
public var maxLength:int;
public var solutionType:Vector.<int>;
public var energy:Number;
//Инициализация
public function MemberType(initLength:int)
{
maxLength = initLength;
solutionType = new Vector.<int>(maxLength, true);
var i:int;
for (i = 0; i < maxLength; i++)
{
solutionType[i] = i;
}
for (i = 0; i < maxLength; i++)
{
tweakSolution();
}
}
//Подстройка
public function tweakSolution()
{
var x, y, temp:int;
do
{
x = Utils.getRandom(maxLength);
y = Utils.getRandom(maxLength);
}while (x == y);
temp = solutionType[x];
solutionType[x] = solutionType[y];
solutionType[y] = temp;
}
public function hasQueen(i:int, j:int):Boolean
{
return solutionType[i] == j;
}
//Вычисление количества конфликтов.
public function computeEnergy()
{
trace("computeEnergy()");
var i, j:int;
var board:Vector.<Vector.<Boolean>> = new Vector.<Vector.<Boolean>>(maxLength, true);
for (i = 0; i < maxLength; i++)
{
board[i] = new Vector.<Boolean>(maxLength, true);
};
var dx:Vector.<int> = Vector.<int>([ -1, 1, -1, 1]);
var dy:Vector.<int> = Vector.<int>([ -1, 1, 1, -1]);
for (i = 0; i < maxLength; i++)
{
var tempSol:int = solutionType[i];
for (j = 0; j < maxLength; j++)
{
if (tempSol == j)
{
board[i][j] = true;
}
else
{
board[i][j] = false;
}
}
}
var conflicts:int = 0;
var x, y, tempX, tempY:int;
for (i = 0; i < maxLength; i++)
{
x = i; y = solutionType[i];
for (j = 0; j < 4; j++)
{
tempX = x; tempY = y;
while(1)
{
tempX += dx[j]; tempY += dy[j];
if ((tempX<0) || (tempX >= maxLength) || (tempY < 0) || (tempY >= maxLength)) break;
if (board[tempX][tempY] == true) conflicts++;
}
}
}
energy = conflicts;
}
public function getEnergy():Number
{
trace("getEnergy()");
computeEnergy();
return energy;
}
}
}
Алгоритм который я реализовываю, значения не имеет, но если интересует, могу рассказать.
Добавлено через 23 минуты
То есть ошибка происходит когда я делаю var copy:MemberType = Utils.clone(mt);
А когда делаю var copy:MemberType = Utils.clone(mt) as MemberType;
происходит
Цитата:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Main/draw()
at Main()
|
когда делаю вызов draw(copy, 250, 10); у которого сигнатура
public function draw(memberType:MemberType, xDelta:int, yDelta:int)