Go における複雑な構造階層の慣用的な実装
Go には継承と埋め込みのサポートがないため、複雑な構造階層の表現は自明ではありません。 Go コンパイラーによる AST 実装での空のメソッドの使用により、その有効性について疑問が生じています。
空のメソッドについて
必須ではありませんが、空のメソッドは次の 2 つの重要な目的を果たします。
活用埋め込み
埋め込みを使用すると、構造体に別の構造体のフィールドとメソッドを組み込んで、継承形式を作成できます。適切な構造体を階層的に埋め込むことで、空のメソッドの必要性を減らすことができます。
オブジェクト-不動-移動可能階層
次の階層を考えてみましょう:
Object --Immovable ----Building ----Mountain --Movable ----Car ----Bike
オブジェクト実装:
type Object interface { object() } type ObjectImpl struct {} func (o *ObjectImpl) object() {}
不動実装:
type Immovable interface { Object immovable() } type ImmovableImpl struct { ObjectImpl // Embedded Object implementation } func (i *ImmovableImpl) immovable() {}
構築実装:
type Building struct { ImmovableImpl // Embedded Immovable implementation // Additional Building-specific fields }
可動実装:
type Movable interface { Object movable() } type MovableImpl struct { ObjectImpl // Embedded Object implementation } func (m *MovableImpl) movable() {}
車の実装:
type Car struct { MovableImpl // Embedded Movable implementation // Additional Car-specific fields }
使用例:
// Building cannot be assigned to a Movable-typed variable because it does not implement the Movable interface. var movable Movable = Building{} // However, it can be assigned to an Object-typed variable because both Immovable and Movable implement Object. var object Object = Building{}
の利点埋め込み:
以上が埋め込みによって Go での複雑な構造階層の実装をどのように改善できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。