Вопрос Solidity «Функция должна указать переопределенный контракт»

Я новичок в 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) не нужна.

Или есть какие-то хитрости, которых я не знаю?

Пожалуйста, дайте мне ответ, так любопытно и не могу найти полезную информацию в документах.

Принципы ООП в JavaScript
Принципы ООП в JavaScript
Парадигма объектно-ориентированного программирования имеет 4 основных принципа,
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

переопределение подразумевает, что вы повторно реализуете метод, который вы унаследовали!. Поэтому, когда вы вызываете эту функцию внутри дочернего класса, будет вызываться эта перереализованная версия функции.

Если бы вы просто вызывали эту функцию без повторной реализации внутри дочернего класса, вы могли бы вызвать ее из-за этого кода:

   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.

Другие вопросы по теме

Разница между массивом состояний, инициализированным с использованием литералов, и другим массивом состояний, инициализированным с помощью «нового» оператора в Solidity?
Как условно выполнить итерацию сопоставления структур и вернуть только некоторые структуры — Solidity
Ошибка: supportChain устарел, вместо этого передайте сети
Существует ли система блокчейна с открытым исходным кодом для хранения небольших данных, таких как ключи и хэши, помимо биткойнов?
Как я могу добавить несколько входов в Solidity?
The Graph: как я могу включить в свой ответ это значение «цены», которое существует в другом типе GraphQL?
Мониторинг транзакций кошелька Polygon с помощью С#
Солана. Несоответствующая сумма перевода и изменение баланса целевого счета
Как получить общий баланс кошелька в Blockcypher API?
Ошибка Solidity: версия 0.8.0: структура, содержащая (вложенное) сопоставление, не может быть построена