Массив интерфейсов контрактов

На языке oop я мог бы сделать следующее:

Я могу определить интерфейс Foo с помощью функции F(). Затем я определяю два класса Bar1 и Bar2, реализующие этот интерфейс. Затем я могу создать массив Foo с именем, скажем, fooArray. Затем я могу вызвать F в любом элементе, не зная, является ли он Bar1 или Bar2.

Я хочу сделать то же самое в солиде (в рамках другого контракта FooBar) или что-то подобное. Это возможно? Буду ли я тогда создавать массив интерфейсов и заполнять его разными контрактами? Означает ли это, что каждый контракт получит свой собственный адрес? Это кажется немного ненужным, так как мне нужно получить доступ к контрактам только через массив, а не через их адреса, т.е. я хочу, чтобы массив вел себя как можно больше как массив экземпляров классов в oop.

Ответы (1)

Да, это возможно, да, у каждого контракта есть собственный адрес, но думайте об этом как о ссылке на память, а не просто о прямом вызове адреса. Вот пример:

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());
        }
    }
}

Вы можете добавлять свои собственные новые экземпляры, которым при создании присваиваются собственные адреса контрактов, вы также можете ссылаться на существующие контракты, если они являются реализациями ваших контрактов или интерфейсов.