Tengo dos contratos relacionados, llamémoslos Supplier
y Producer
.
A Supplier
puede tener un State
de inactive
, active
o kaput
, pero solo active
se pueden agregar proveedores a un Producer
.
Así que algo como esto:
contract Supplier {
enum State { inactive, active, kaput }
State constant DEFAULT_STATE = State.inactive
State public status;
function Supplier() {
status = DEFAULT_STATE;
}
}
Pero hacer esto no funciona.
contract Producer {
function addSupplier(Supplier _supplier) {
require(_supplier.status == Supplier.State.active);
}
}
Consideré usar una interfaz, pero enum
está específicamente prohibido en una interfaz.
¿Cómo expongo enum
definiciones a contratos externos sin recurrir a algo feo comorequire(uint(supplier.status) == 1);
Las enumeraciones definidas dentro de un contrato son accesibles de forma predeterminada desde otros contratos. En Producer puedes usar las expresiones:
Supplier.State.inactive
Supplier.State.active
Supplier.State.kaput
Su código no funciona porque public
las variables de estado se comportan como funciones desde la perspectiva de otros contratos. Intenta reemplazar esta línea:
require(_supplier.status == Supplier.State.active);
con este:
require(_supplier.status() == Supplier.State.active);