2014-11-12 2 views
0

Я создал общую структуру данных и внедрил в нее пользовательский итератор , что итератор получает интерфейс, который имеет функцию, каждый объект в структуре данных отправляется к функции из интерфейса на объекте.Как передать параметры извне в реализацию inteface

Вот как я могу это сделать:

Интерфейс:

public interface QTreeAction<T> { 
    void actToDo(T Param); 
} 

Итератор:

public void Iterate(QNode qNode, QTreeAction<T> action) 
{ 
    if (qNode == null) 
     return; 

    for (int j = 0; j < qNode.objList.size(); j++) 
    { 
     action.actToDo(qNode.objList.get(j).Object); 
    } 

    for (int i = 0; i < 4; i++) 
    { 
     this.Iterate(qNode.Nodes.get(i), action); 
    } 
} 

И призыв:

public void Render(float fDelta, Canvas g) { 
    g.drawRGB(255, 255, 10); 
    g.setMatrix(this.gameMatrix); 

    ohHandler.render(new QTreeAction<Tile>() { 
     @Override 
     public void actToDo(Tile Param) { 
      Param.render(fDelta, g); 
     } 
    }); 
    this.pPlayer.render(fDelta, g); 
} 

(ohHandler имеет узел и вызывает ite rator)

Рендер функция:

public void render(float fDelta, Canvas g) { 
    g.drawBitmap(StaticDataHolder.GameTextures.blocks[ttType.getValue()], 
      this.vecTilePosition.getX(), this.vecTilePosition.getY(), null); 
} 

Как вы видите Param.render требует 2 параметра, которые предоставляются функции, однако в этой ситуации есть ошибка, и она просит меня сделать Params, как окончательный, но он бросает и ошибки во время выполнения.

Как я могу это преодолеть?

+1

ли вы имеете в виду, есть ошибка, если вы * действительно * сделать параметры 'final'? Какая ошибка? –

ответ

0

В этом случае вы можете ссылаться только на конечные переменные внутри анонимного класса.

Это должно сделать трюк:

public void Render(float fDelta, Canvas g) { 
    final Cavas gFinal = g; 
    final float fDeltaFinal = fDelta; 
    ohHandler.render(new QTreeAction<Tile>() { 
     @Override 
     public void actToDo(Tile Param) { 
      Param.render(fDeltaFinal , gFinal); 
     } 
    }); 
    this.pPlayer.render(fDelta, g); 
} 
+0

Я немного изменил свой код, а что, если мне нужно изменить холст внутри функции? –

+0

@ HuMMeR-SI вы можете без проблем изменить состояние 'Canvas g', но вы не сможете использовать' g = new Canvas(); '(или что-то подобное), вот и все. –

+0

Вы можете свободно менять все, что хотите. Но переменные, которые вы передаете от одного метода к анонимному классу, должны быть окончательными. – Jannek

Смежные вопросы