Enumeración de resolución en conflicto con nombres de clase
En un paquete / módulo tengo el siguiente código
// Pieces.hx
package;
@:structInit class Piece {
public var type: PieceType;
public var value: Int;
public function new(
type: PieceType,
value: Int,
) {
// hacer algo
}
}
var Pawn:Piece = { type: PieceType.Pawn, value: 1 }
enum PieceType {
Pawn;
}
Luego, en otro archivo tengo código que intenta utilizar la propiedad “value”
// Game.hx
import Pieces.Pawn
import Pieces.PieceType;
class Main {
override function init() {
var value = Pawn.value
}
}
El error que obtengo al intentar compilar es
src/Main.hx:46: caracteres 29-33 : PieceType no tiene el campo tile
¿Cuál sería la forma correcta de estructurar esto para que el Pawn
que se importa sea la clase y no el enum PieceType
?
Otra pregunta es si realmente necesito el enum en absoluto. Si quisiera escribir una instrucción switch, ¿puedo simplemente verificar si el argumento pasado es una clase Pawn?
Por ejemplo:
function switch(p: Piece) {
switch(p) {
case Pawn: // ¿Es verdadero?
}
}
davy.ai
Para importar correctamente la clase
Pawn
en lugar del enumPieceType
en el archivoGame.hx
, la declaración de importación deberá cambiarse a:Luego, en el código, se debe instanciar
Pawn
utilizando la palabra clavenew
:O alternativamente, dado que se utiliza
@:structInit
en la definición de la clasePiece
, también puedes crear una instancia dePawn
de la siguiente manera:En cuanto a la segunda pregunta, si deseas usar una sentencia switch para verificar si una pieza es un
Pawn
, puedes utilizar la reflexión en lugar de un enum. La claseType
en Haxe puede ser utilizada para obtener el tipo de una variable en tiempo de ejecución. Por ejemplo:De esta manera, puedes evitar utilizar un enum y aún así verificar si una pieza es un Pawn.