Я новичок в Solidity, и у меня есть вопрос о множественном наследовании.
Итак, если у меня есть такие контракты, как:
contract A {
function foo() public virtual {
console.info("A");
}
}
contract B is A {
function foo() public virtual override {
console.info("B");
}
}
contract C is A, B {
function foo() public override(A, B) {
super.foo();
}
}
foo
функция контракта C должна быть override(A, B)
insdead override(B)
или это выдаст ошибку типа Function needs to specify overridden contract "A".
Так вот вопрос, функция должна указать полное наследование родителей.
Почему он не может знать информацию по contract C is A, B
,
Я имею в виду, в чем смысл? Часть overrider(A,B)
не нужна.
Или есть какие-то хитрости, которых я не знаю?
Пожалуйста, дайте мне ответ, так любопытно и не могу найти полезную информацию в документах.
переопределение подразумевает, что вы повторно реализуете метод, который вы унаследовали!. Поэтому, когда вы вызываете эту функцию внутри дочернего класса, будет вызываться эта перереализованная версия функции.
Если бы вы просто вызывали эту функцию без повторной реализации внутри дочернего класса, вы могли бы вызвать ее из-за этого кода:
contract B is A {}
Если вы вызываете метод, который не определен в B, компилятор проверит контракт A и обнаружит, что вызовет его.
Официальная документация прочность гласит:
For multiple inheritance, the most derived base contracts that define the same function must be specified explicitly after the
override
keyword. In other words, you have to specify all base contracts that define the same function and have not yet been overridden by another base contract (on some path through the inheritance graph). Additionally, if a contract inherits the same function from multiple (unrelated) bases, it has to explicitly override it
Поэтому в вашем примере вы должны использовать ключевое слово явныйoverride
.