На языке oop я мог бы сделать следующее:
Я могу определить интерфейс Foo с помощью функции F(). Затем я определяю два класса Bar1 и Bar2, реализующие этот интерфейс. Затем я могу создать массив Foo с именем, скажем, fooArray. Затем я могу вызвать F в любом элементе, не зная, является ли он Bar1 или Bar2.
Я хочу сделать то же самое в солиде (в рамках другого контракта FooBar) или что-то подобное. Это возможно? Буду ли я тогда создавать массив интерфейсов и заполнять его разными контрактами? Означает ли это, что каждый контракт получит свой собственный адрес? Это кажется немного ненужным, так как мне нужно получить доступ к контрактам только через массив, а не через их адреса, т.е. я хочу, чтобы массив вел себя как можно больше как массив экземпляров классов в oop.
Да, это возможно, да, у каждого контракта есть собственный адрес, но думайте об этом как о ссылке на память, а не просто о прямом вызове адреса. Вот пример:
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());
}
}
}
Вы можете добавлять свои собственные новые экземпляры, которым при создании присваиваются собственные адреса контрактов, вы также можете ссылаться на существующие контракты, если они являются реализациями ваших контрактов или интерфейсов.