Vertrag, der eine Schnittstelle verwendet, wird nicht kompiliert

Ich lerne Solidity und benutze Remix, um zu experimentieren und mein Lernen zu verbessern. Ich versuche gerade, einen einfachen Vertrag zu erstellen, der eine Schnittstelle verwendet.

pragma solidity ^0.4.19;

contract InterfaceWithMe {

    function call() returns (string);

}

contract Interfacing {

    address ckAddress = 0x9fe1c58215407d67719ba680360940056e5eceb7;
    InterfaceWithMe daContract = InterfaceWithMe(ckAddress);

    function call() returns (string) {
        return daContract.call();
    }

Wenn ich versuche, dies auf Remix zu kompilieren, erhalte ich in Zeile 14 den folgenden Typfehler:

TypeError:Rückgabeargumenttyp unzugänglicher dynamischer Typ ist nicht implizit in den erwarteten Typ (Typ der ersten Rückgabevariablen) Stringspeicher konvertierbar.

Hier ist der andere Vertrag, den ich als Schnittstelle zu diesem Vertrag verwende:

pragma solidity ^0.4.19;

contract InterfaceWithMe {

    function call() returns (string) {
        return "Hello";
    }
}

Danke für die Hilfe.

Ich schlage vor, die Antwort ist hier und die andere

Antworten (1)

Ein bisschen Fummelei für Lesbarkeit und Stil.

pragma solidity 0.4.25;

contract Interface {
    function call() public pure returns (string);
    function isInterface() public pure returns(bool);
}

contract Interfacing {

    Interface daContract; 

    constructor(address theContract) public {
        daContract = Interface(theContract);
        require(daContract.isInterface());
    }

    function call() public view returns (string) {
        return daContract.call();
    }

}

contract InterfaceWithMe is Interface {

    function call() public pure returns (string) {
        return "Hello";
    }

    function isInterface() public pure returns(bool) {
        return true;
    }
}

Hier ist es in Remix, um zu zeigen, dass es funktioniert.

  1. EinsetzenInterfaceWithMe
  2. Kopieren Sie die bereitgestellte Adresse in die Zwischenablage.
  3. Stellen Sie Interfacingdie Übergabe der Adresse aus der Zwischenablage an den Konstruktor bereit.
  4. Rufen callSie `Interfacing.
  5. Hello

Geben Sie hier die Bildbeschreibung ein

Ich hoffe es hilft.

Danke für Ihre Antwort! Ich habe einige Anschlussfragen für Sie. Warum muss InterfaceWithMe von Interface erben? Sollte Interface nicht von Interface erben?
Es geht darum, wann man Komposition und wann Vererbung verwendet. Camry is Cardaher muss es alle geerbten Standardfunktionen implementieren. Driverbeginnt Carso, dass eine Instanz von etwas als Typ umgewandelt Carund dann mit aufgerufen wird myCar.start (). Beachten Sie, dass der Compiler den Quellcode sehen kann, um die Schnittstelle auszuarbeiten.
Warum Vertragsschnittstellenexistenz. Ist es notwendig, dass Bridge die Schnittstelle implementiert? Danke