Matriz de interfaces de contratos

En un lenguaje OOP, podría hacer lo siguiente:

Puedo definir una interfaz Foo con una función F(). Luego defino dos clases Bar1 y Bar2 implementando esta interfaz. Luego puedo crear una matriz de Foo llamada say fooArray. Entonces puedo llamar a F en cualquier elemento sin saber si es Bar1 o Bar2.

Quiero hacer lo mismo en solidity (dentro de un contrato FooBar diferente), o algo similar. ¿Es eso posible? ¿Entonces crearía una matriz de interfaces y la llenaría con diferentes contratos? ¿Significaría eso que cada contrato tendrá su propia dirección? Eso parece un poco innecesario ya que solo necesito acceder a los contratos a través de la matriz, no a través de sus direcciones, es decir, quiero que la matriz se comporte tanto como sea posible como una matriz de instancias de clases en OOP.

Respuestas (1)

Sí, es posible, sí, cada contrato tiene su propia dirección, pero considérelo como una referencia de memoria en lugar de simplemente una llamada directa a una dirección. Aquí hay un ejemplo:

pragma solidity ^0.4.0;

interface Letter {
    function f() 
        public 
        returns (uint);
}

contract A is Letter {
    function f() 
        public 
        returns (uint) {
        return 1;
    }
}

contract B is A {
}

contract C is Letter {
    function f() 
        public 
        returns (uint) {
        return 2;
    }
}

contract Alphabet {
    Letter[] letters;

    event printer(uint);

    // Add our own new contracts
    function Alphabet() 
        public {
        letters.push(new A());
        letters.push(new B());
        letters.push(new C());
    }

    // Include existing contracts
    function alphabetFromAddresses(address _addrA, address _addrB, 
                                   address _addrC)
        public{
        letters.push(A(_addrA));
        letters.push(B(_addrB));
        letters.push(C(_addrC));
    }

    function getLetters() 
        public {
        for(uint i = 0; i < letters.length; i++) {
            printer(letters[i].f());
        }
    }
}

Puede agregar sus propias instancias nuevas a las que se les asignan sus propias direcciones de contrato en el momento de la creación, también puede hacer referencia a contratos existentes siempre que sean implementaciones de sus contratos o interfaces.