Ich versuche, die zahlbare Funktion eines Elternteils zu erben und zu überschreiben (und einige Modifikatoren und Logik hinzuzufügen), aber bisher scheint dies nicht möglich zu sein.
Mein erster intuitiver Versuch war ungefähr so:
contract foo {
function test() public payable returns (uint256) {
return msg.value;
}
}
contract bar is foo {
function test() public payable returns (uint256) {
return super.test.value(msg.value / 2)();
}
}
und Kompilierfehler erhalten:
TypeError: Member "value" not found or not visible after argument-dependent lookup in function () - did you forget the "payable" modifier?
super.test.value(msg.value)();
Der Funktion einen anderen Namen zu geben funktioniert auch nicht, also ist es kein vorrangiges Problem.
contract foo {
function test() public payable returns (uint256) {
return msg.value;
}
}
contract bar is foo {
function anotherTest() public payable returns (uint256) {
return super.test.value(msg.value / 2)();
}
}
Ich bin etwas weiter gekommen, indem ich den Compiler mit einem Casting ausgetrickst habe, aber das ist offensichtlich nicht gut, da es zur Laufzeit eine Endlosschleife verursachen würde:
contract foo {
function test() public payable returns (uint256) {
return msg.value;
}
}
contract bar is foo {
function test() public payable returns (uint256) {
return foo(address(this)).test.value(msg.value / 2)();
}
}
Was funktioniert, ist die Kombination der beiden, dh ihm einen anderen Namen und eine andere Besetzung zu geben:
contract foo {
function test() public payable returns (uint256) {
return msg.value;
}
}
contract bar is foo {
function anotherTest() public payable returns (uint256) {
return foo(address(this)).test.value(msg.value / 2)();
}
}
Jetzt gibt der Aufruf von bar.test() mit 6 wei 6 zurück und der Aufruf von bar.anotherTest() gibt 3 zurück. Aber das ist nicht genau das, was ich will, da es immer noch test() durch bar verfügbar macht.
Also was mache ich falsch, oder ist das Absicht? Würde wirklich gerne verstehen, warum sich Solidity so verhält und ob es eine Problemumgehung gibt, um das zu erreichen, was ich will. Danke!
Da foo
es sich um den Basisvertrag handelt, rufst du dich selbst innerhalb desselben Vertrags an, bar
wenn du anrufst .super.test()
Jetzt versuchen Sie, sich die Hälfte zu schicken, msg.value
und die andere Hälfte bleibt noch in Ihrem Vertrag.
Ich würde empfehlen, den gewünschten Wert als Parameter der Funktion zu übergeben.
jhuang
super.test()
ohne.value
oder mit einem Parameter würde ausreichen. Danke!