Solidity

當繼承的合約具有相同的方法名稱但簽名略有不同時如何覆蓋?

  • August 16, 2021

我繼承了 2 個具有相同函式名稱但簽名略有不同的抽象契約。

這些是 2 個基本契約:

abstract contract Base1 {
   function foo() internal view virtual returns (address) {
       return msg.sender;
   }
}

abstract contract Base2 {
   function foo() internal override virtual view returns (address payable ret) {
        return msg.sender;
   } 
}

我的契約繼承自他們兩個,並試圖覆蓋該foo()方法。在這裡,我會收到一個錯誤,因為它們的簽名略有不同:

contract MyContract is Base1, Base2 {
   // This is going to have an error DeclarationError: Function with same name and parameter types defined twice.
   function foo() internal view override(Base1, Base2) returns (address payable) {
        return msg.sender;
   }
}

上面的覆蓋在編譯時會拋出這個錯誤:

DeclarationError: 具有相同名稱和參數類型的函式定義了兩次。

在我無法控制的來自外部包的繼承契約在其中具有相同方法但簽名略有不同的情況下,如何覆蓋?

這在設計上是不可能的,因為addressandaddress payable是不同的類型,並且一個不能隱式轉換為另一個(故意)。

但這很容易處理。只需讓您的函式也返回address並讓呼叫者將其轉換為address payable.

其他不受您控制且已經呼叫foo()的功能預計是不可付款address的,因此如果他們將您的地址視為這樣,這不是問題。

而你自己的函式知道它們正在處理你自己的合約並且它實際上返回一個應付地址,可以將值轉換為address payable. 或者,您可以添加一個address payable只為他們返回的助手。

引用自:https://ethereum.stackexchange.com/questions/107025