Array von Schnittstellen von Verträgen

In einer oop-Sprache könnte ich Folgendes tun:

Ich kann eine Schnittstelle Foo mit einer Funktion F() definieren. Dann definiere ich zwei Klassen Bar1 und Bar2, die diese Schnittstelle implementieren. Ich kann dann ein Array von Foo namens sagen wir fooArray erstellen. Ich kann dann F in jedem Element aufrufen, ohne zu wissen, ob es Bar1 oder Bar2 ist.

Ich möchte dasselbe in Solidität tun (innerhalb eines anderen Vertrags FooBar) oder etwas Ähnliches. Ist das möglich? Würde ich dann eine Reihe von Schnittstellen erstellen und mit verschiedenen Verträgen füllen? Bedeutet das, dass jeder Vertrag eine eigene Adresse bekommt? Das scheint ein bisschen unnötig, da ich nur über das Array auf die Verträge zugreifen muss, nicht über ihre Adressen, dh ich möchte, dass sich das Array so weit wie möglich wie ein Array von Instanzen von Klassen in oop verhält.

Antworten (1)

Ja, das ist möglich, ja, jeder Vertrag hat seine eigene Adresse, aber stellen Sie es sich wie eine Erinnerungsreferenz vor und nicht nur als direkten Aufruf einer Adresse. Hier ist ein Beispiel:

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

Sie können Ihre eigenen neuen Instanzen hinzufügen, denen bei der Erstellung alle ihre eigenen Vertragsadressen zugewiesen werden. Sie können auch auf vorhandene Verträge verweisen, solange es sich um Implementierungen Ihrer Verträge oder Schnittstellen handelt.