Go では、基本構造を超えて機能を拡張する場合、継承の代わりに合成を使用することがよくあります。これにより、コードが明確になり、重複が最小限に抑えられます。
他の構造体によって拡張できるメソッドを含む基本構造体を定義することが目的である次の例を考えてみましょう。
type MyInterface interface { SomeMethod(string) OtherMethod(string) } type Base struct { B MyInterface } func (b *Base) SomeMethod(x string) { b.B.OtherMethod(x) } type Extender struct { Base } func (b *Extender) OtherMethod(x string) { // Do something... } func NewExtender() *Extender { e := Extender{} e.Base.B = &e return &e }
この例は動作しますが、 、その循環構造により複雑に見えます。コードの重複を減らし、より読みやすいコードを作成するには、埋め込みの使用を検討してください。
埋め込みを使用すると、特定のインターフェイスを実装する構造体を作成できます。たとえば、読み取りと書き込みのための狭いインターフェイスを作成できます:
type Reader interface { Read(p []byte) (n int, err error) } type Writer interface { Write(p []byte) (n int, err error) }
これらのインターフェイスを作成することで、ReadWriter インターフェイスを作成できます:
type ReadWriter interface { Reader Writer }
同様に、次のような構造体を作成できます。 Reader と Writer を MyReadWriter 構造体に実装します:
type MyReader struct {} func (r *MyReader) Read(p []byte) (n int, err error) { // Implements Reader interface. } type MyWriter struct {} func (w *MyWriter) Write(p []byte) (n int, err error) { // Implements Writer interface. } type MyReadWriter struct { *MyReader *MyWriter }
MyReadWriter 構造体に ReadWriter インターフェイスが実装されるようになり、この構造体内で Reader または Writer を実装するコンポーネントを使用できるようになります。
この埋め込みこの技術は、コードの再利用性、依存関係の注入を促進し、特定のインターフェイスを実装するコンポーネントの交換を可能にすることでテストを容易にします。
以上がGo と継承: コードの再利用性に関して、合成が継承よりも優れているのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。