時価総額: $2.1607T 1.76%
ボリューム(24時間): $86.9861B 19.97%
恐怖と貪欲の指数:

15 - 極度の恐怖

  • 時価総額: $2.1607T 1.76%
  • ボリューム(24時間): $86.9861B 19.97%
  • 恐怖と貪欲の指数:
  • 時価総額: $2.1607T 1.76%
暗号
トピック
暗号化
ニュース
暗号造園
動画
トップクリプトスペディア

言語を選択する

言語を選択する

通貨の選択

暗号
トピック
暗号化
ニュース
暗号造園
動画

Solidity スマート コントラクトでは継承はどのように機能しますか?

Solidity inheritance enables code reuse and modularity through virtual functions, multiple inheritance, and abstract contracts, but requires careful design to avoid gas costs and conflicts.

2025/11/11 22:40

Solidity の継承: モジュール式スマート コントラクトの構築

1. Solidity の継承により、あるコントラクトが別のコントラクトのプロパティと機能を採用できるようになり、コードの再利用と構造化設計が可能になります。派生コントラクトは、プライベートとしてマークされていない限り、基本コントラクトを継承し、その状態変数、関数、および修飾子にアクセスできます。このメカニズムはロジックの階層的構成をサポートし、複数のコントラクトにわたる冗長性を削減します。

2. コントラクトが別のコントラクトから継承される場合、継承された動作を拡張または変更できます。たとえば、子コントラクトは、基本関数のvirtualキーワードと派生関数のoverrideキーワードを使用して、親の関数をオーバーライドできます。これにより、同じ関数シグネチャの異なる実装がコントラクト層全体に存在できるポリモーフィックな動作が可能になります。

3. Solidity では多重継承がサポートされており、コントラクトを複数の親から継承できます。継承の順序は、Solidity が関数呼び出しを解決するために使用する C3 線形化アルゴリズムにより重要になります。最初にリストされているコントラクトはメソッドの解決において優先されます。これは、親間で重複する関数が存在する場合のあいまいさを回避するのに役立ちます。

4. 継承されたコントラクト内のコンストラクターは、最も基本レベルのコントラクトから派生コントラクトまで、継承の順序で実行されます。引数が必要な場合は、各コンストラクターを明示的に呼び出す必要があり、継承ツリーのすべてのレベルで状態変数が適切に初期化されるようにします。

5. 可視性は継承において重要な役割を果たします。パブリック関数と内部関数は派生コントラクトからアクセスできますが、プライベート関数は定義コントラクトに限定されています。内部関数はオーバーライドできるため、柔軟にカスタマイズできますが、外部関数はコントラクト コンテキストの外でのみ呼び出すことができるため、オーバーライドできません。

関数のオーバーライドと仮想メソッド

1. 派生コントラクトで関数をオーバーライドできるようにするには、基本コントラクトで関数をvirtualとして宣言する必要があります。これは、関数の実装が子コントラクトで置き換えられる可能性があることを示します。このキーワードがないと、関数は固定されたままとなり、サブクラス内で変更できなくなります。

2. 仮想関数を再定義する場合、オーバーライド コントラクトではoverrideキーワードを使用する必要があります。これにより、明示的な意図が強制され、偶発的なオーバーライドが防止されます。関数がオーバーライドを宣言せずにオーバーライドしようとすると、コンパイラはエラーをスローします。

3. オーバーライドする場合、名前、パラメーター、戻り値の型を含む関数のシグネチャは、元の関数と正確に一致する必要があります。可視性 (パブリック、内部) などの修飾子も互換性がある必要がありますが、より厳密な可視性 (パブリックから内部に減らすなど) は許可されません。

4. super を使用して、オーバーライドされた関数の親バージョンを呼び出すことができます。このキーワードは、呼び出しを継承階層を通じてルーティングし、次に近い関数の実装を呼び出します。あるいは、 BaseContractName.functionName()構文で特定の祖先のメソッドを直接呼び出すこともできます。

5. 修飾子のオーバーライドも同様のルールに従います。修飾子は virtual として宣言し、派生コントラクトでオーバーライドできます。これにより、関数に適用される事前条件または事後条件を変更し、コンテキストに基づいてアクセス制御や実行ロジックを適応させることができます。

抽象的なコントラクトとインターフェース

1. 抽象コントラクトは、実装されていない 1 つ以上の機能を含む不完全なコントラクトです。これらは、 abstractキーワードを使用して宣言され、他のコントラクトを構築するためのテンプレートとして機能します。抽象コントラクトを継承するコントラクトは、実装されていない関数をすべて実装するか、それ自体を抽象としてマークする必要があります。

2. 本体のない抽象コントラクト内の関数は、自動的に抽象とみなされ、非抽象子によって実装される必要があります。これらの関数は、子孫が従う必要がある必須のインターフェイスを定義し、実装間での一貫性を確保します。

3. インターフェイスは、関数宣言 (本体なし)、イベント、構造体のみを含むようにコントラクトを制限することで、さらに抽象化を進めます。インターフェイス内のすべての関数は暗黙的に外部関数であり、状態変数を持つことはできません。コントラクトは、そのすべての機能の具体的な定義を提供することによってインターフェイスを実装します。

4. 単一のコントラクトで、ERC-20、ERC-721、またはカスタム プロトコル仕様などのさまざまな標準化された動作を組み合わせて、複数のインターフェイスを実装できます。これにより、相互運用性と、イーサリアム エコシステムで広く受け入れられている標準への準拠が促進されます。

5. インターフェイスにはコンストラクターを含めたり、通常のコントラクトを継承したりできないため、再利用可能なビジネス ロジックをカプセル化するのではなく、コントラクト間の通信境界を定義するのに最適です。それらは不変であるため、コントラクト間の相互作用の保証に最適です。

よくある落とし穴とベストプラクティス

1. 多重継承中に親コントラクトの順序を間違えると、C3 線形化ルールにより予期しない動作が発生する可能性があります。開発者は、正しいメソッド解決を確保し、サイレントバグを回避するために、基本コントラクトを優先順位の降順にリストする必要があります。

2. 深い継承ツリーを過度に使用すると、可読性が低下し、導入コストが増加する可能性があります。焦点を絞った単一目的のコントラクトによるフラットな構造は、多くの場合、複雑な階層よりも保守しやすく、ガス効率が高いことがわかります。

3. オーバーライド可能な関数を仮想としてマークしないと、子コントラクトでの拡張が妨げられ、柔軟性が制限されます。逆に、必要なく多くの関数を仮想としてマークすると、意図しない変更点が公開され、セキュリティが危険にさらされる可能性があります。

4. 継承されたチェーン内のコンストラクター引数の不一致により、コンパイルが失敗します。継承パス内の各コンストラクターは、コントラクトのインスタンス化中に明示的に渡される、適切な数と型の引数を受け取る必要があります。

5. コードを再利用するために継承のみに依存すると、ライブラリや構成可能パターンなどの代替手段を見落とす可能性があります。ディレクティブまたはデリゲート呼び出しに usingを使用すると、特定のシナリオでより安全でモジュール化されたソリューションを提供できます。

よくある質問

2 つの親コントラクトで同じ名前の関数が定義されている場合はどうなりますか? Solidity では、このような競合が子コントラクト内で明示的に解決されることが必要です。開発者は関数をオーバーライドし、通常はスーパーまたは直接修飾を介して親バージョンの 1 つを呼び出すことによって、あいまいさを処理する方法を決定する必要があります。

コントラクトは通常のコントラクトとインターフェースの両方から継承できますか?はい。コントラクトは、具体的なコントラクト、抽象的なコントラクト、インターフェイスの組み合わせなど、複数のソースから継承できます。同じ継承ルールが適用され、インターフェイスは実装する必要がある関数シグネチャのみを提供します。

契約の継承を防ぐことはできますか? Solidity は、継承をブロックする「final」のような組み込みキーワードを提供しません。ただし、開発者はプライベート コンストラクターとのコントラクトを設計したり、継承を非実用的または非効率にする方法で機能を制限したりすることができます。

継承は展開中のガスコストにどのような影響を与えますか?継承されたコードにより、結果として得られるコントラクトのバイトコード サイズが増加し、展開コストに直接影響します。外部ライブラリを使用しない限り、基本コントラクトの関数は最終バイトコードにコピーされるため、大規模な継承ツリーのデプロイコストが高くなります。

免責事項:info@kdj.com

提供される情報は取引に関するアドバイスではありません。 kdj.com は、この記事で提供される情報に基づいて行われた投資に対して一切の責任を負いません。暗号通貨は変動性が高いため、十分な調査を行った上で慎重に投資することを強くお勧めします。

このウェブサイトで使用されているコンテンツが著作権を侵害していると思われる場合は、直ちに当社 (info@kdj.com) までご連絡ください。速やかに削除させていただきます。

関連知識

Bybit で BTC 取引を行う場合、リニア永久契約とインバース永久契約のどちらを選択すればよいですか?

Bybit で BTC 取引を行う場合、リニア永久契約とインバース永久契約のどちらを選択すればよいですか?

2026-06-06 02:54:55

契約決済の仕組み1. Bybit のリニア無期限契約は USDT で決済されます。これは、すべての損益計算、証拠金要件、清算閾値がステーブルコイン単位で表示されることを意味します。 2. 逆永久契約は BTC 自体で決済されるため、すべての取引はトレーダーの BTC 残高に直接影響します。利益があれ...

ストップハントやなりすましなどの先物市場操作を特定して回避するにはどうすればよいでしょうか?

ストップハントやなりすましなどの先物市場操作を特定して回避するにはどうすればよいでしょうか?

2026-06-07 14:20:10

Bitcoin 半減力学1. Bitcoin のプロトコルは、ブロック報酬が約 210,000 ブロックごとに半分になる固定発行スケジュールを強制します。 2. このイベントはおよそ 4 年ごとに発生し、流通する新しい BTC の数を直接減少させます。 3. マイナーは、2020 年の半減期の時点で...

Bybit で 1 日の最大損失を制限するリスク管理ルールを設定するにはどうすればよいですか?

Bybit で 1 日の最大損失を制限するリスク管理ルールを設定するにはどうすればよいですか?

2026-06-04 16:40:15

アカウントレベルの損失制限の設定1. 2 要素認証を使用して、Web またはモバイル アプリケーション経由で Bybit アカウントにログインします。 2. 「資産」セクションに移動し、左側のメニューから「リスク管理」を選択します。 3. 「日次損失制限」を選択し、機能をオンに切り替えてコントロール...

Binance でポートフォリオ証拠金モードを有効にして証拠金要件を減らすにはどうすればよいですか?

Binance でポートフォリオ証拠金モードを有効にして証拠金要件を減らすにはどうすればよいですか?

2026-06-05 04:59:43

Bitcoin 半減力学1. Bitcoin のプロトコルは、ブロック報酬が約 210,000 ブロックごとに半分になる固定発行スケジュールを強制します。 2. このイベントはおよそ 4 年ごとに発生し、ブロックごとに流通する新しい BTC の数を直接減少させます。 3. マイナーは、2020 年の...

オープン先物ポジションをクローズせずに Binance から Bybit に移行するにはどうすればよいですか?

オープン先物ポジションをクローズせずに Binance から Bybit に移行するにはどうすればよいですか?

2026-06-04 03:59:47

Bitcoin 半減力学1. Bitcoin のプロトコルは、ブロック報酬が約 210,000 ブロックごとに半分になる固定発行スケジュールを強制します。 2. このイベントはおよそ 4 年ごとに発生し、流通する新しい BTC の数を直接減少させます。 3. マイナーは、2020 年の半減期の時点で...

米国における仮想通貨先物取引の利益による税金への影響をどのように処理すればよいでしょうか?

米国における仮想通貨先物取引の利益による税金への影響をどのように処理すればよいでしょうか?

2026-05-29 18:19:59

Bitcoin 半減力学1. Bitcoin のプロトコルでは、ブロック報酬を通じて新しいユニットが導入され、2,100 万コインの固定供給上限が強制されます。 2. 210,000 ブロックごと、つまり約 4 年ごとに、ブロック報酬は半分に減ります。これは半減として知られるプロセスです。 3. 最...

Bybit で BTC 取引を行う場合、リニア永久契約とインバース永久契約のどちらを選択すればよいですか?

Bybit で BTC 取引を行う場合、リニア永久契約とインバース永久契約のどちらを選択すればよいですか?

2026-06-06 02:54:55

契約決済の仕組み1. Bybit のリニア無期限契約は USDT で決済されます。これは、すべての損益計算、証拠金要件、清算閾値がステーブルコイン単位で表示されることを意味します。 2. 逆永久契約は BTC 自体で決済されるため、すべての取引はトレーダーの BTC 残高に直接影響します。利益があれ...

ストップハントやなりすましなどの先物市場操作を特定して回避するにはどうすればよいでしょうか?

ストップハントやなりすましなどの先物市場操作を特定して回避するにはどうすればよいでしょうか?

2026-06-07 14:20:10

Bitcoin 半減力学1. Bitcoin のプロトコルは、ブロック報酬が約 210,000 ブロックごとに半分になる固定発行スケジュールを強制します。 2. このイベントはおよそ 4 年ごとに発生し、流通する新しい BTC の数を直接減少させます。 3. マイナーは、2020 年の半減期の時点で...

Bybit で 1 日の最大損失を制限するリスク管理ルールを設定するにはどうすればよいですか?

Bybit で 1 日の最大損失を制限するリスク管理ルールを設定するにはどうすればよいですか?

2026-06-04 16:40:15

アカウントレベルの損失制限の設定1. 2 要素認証を使用して、Web またはモバイル アプリケーション経由で Bybit アカウントにログインします。 2. 「資産」セクションに移動し、左側のメニューから「リスク管理」を選択します。 3. 「日次損失制限」を選択し、機能をオンに切り替えてコントロール...

Binance でポートフォリオ証拠金モードを有効にして証拠金要件を減らすにはどうすればよいですか?

Binance でポートフォリオ証拠金モードを有効にして証拠金要件を減らすにはどうすればよいですか?

2026-06-05 04:59:43

Bitcoin 半減力学1. Bitcoin のプロトコルは、ブロック報酬が約 210,000 ブロックごとに半分になる固定発行スケジュールを強制します。 2. このイベントはおよそ 4 年ごとに発生し、ブロックごとに流通する新しい BTC の数を直接減少させます。 3. マイナーは、2020 年の...

オープン先物ポジションをクローズせずに Binance から Bybit に移行するにはどうすればよいですか?

オープン先物ポジションをクローズせずに Binance から Bybit に移行するにはどうすればよいですか?

2026-06-04 03:59:47

Bitcoin 半減力学1. Bitcoin のプロトコルは、ブロック報酬が約 210,000 ブロックごとに半分になる固定発行スケジュールを強制します。 2. このイベントはおよそ 4 年ごとに発生し、流通する新しい BTC の数を直接減少させます。 3. マイナーは、2020 年の半減期の時点で...

米国における仮想通貨先物取引の利益による税金への影響をどのように処理すればよいでしょうか?

米国における仮想通貨先物取引の利益による税金への影響をどのように処理すればよいでしょうか?

2026-05-29 18:19:59

Bitcoin 半減力学1. Bitcoin のプロトコルでは、ブロック報酬を通じて新しいユニットが導入され、2,100 万コインの固定供給上限が強制されます。 2. 210,000 ブロックごと、つまり約 4 年ごとに、ブロック報酬は半分に減ります。これは半減として知られるプロセスです。 3. 最...

すべての記事を見る

User not found or password invalid

Your input is correct