具象型の実装がインターフェイス メソッドで予期されるインターフェイス型ではなく具象型を返すと、Go がエラーをスローするのはなぜですか?

DDD
リリース: 2024-10-30 07:33:02
オリジナル
186 人が閲覧しました

Why does Go throw an error when a concrete type implementation returns a concrete type instead of the expected interface type in an interface method?

インターフェイス メソッドを返すインターフェイスが具象型の実装と一致しない

Go インターフェイスを使用する場合、インターフェイスの戻り型を宣言するインターフェイス メソッドが実装されるとエラーが発生する可能性があります具体的な種類によって。このエラーは、メソッドの実装がインターフェイスの型を直接返さず、インターフェイスを実装する具象型を返すために発生します。

次の例を考えてみましょう。

<code class="go">package main

import "fmt"

type Foo struct {
    val string
}

func (f *Foo) String() string {
    return f.val
}

type StringerGetter interface {
    GetStringer() fmt.Stringer
}

type Bar struct{}

func (b *Bar) GetStringer() *Foo {
    return &Foo{"foo"}
}

func Printer(s StringerGetter) {
    fmt.Println(s.GetStringer())
}

func main() {
    f := Bar{}
    Printer(&f)
}</code>
ログイン後にコピー

ここでは、プリンター関数は StringerGetter インターフェイスを想定しており、このインターフェイスには fmt.Stringer を返す GetStringer メソッドがありますが、Bar 型の GetStringer メソッドは fmt.Stringer インターフェイスを実装する具象型 Foo を返します。これにより、次のエラーが発生します:

prog.go:29: cannot use &f (type *Bar) as type StringerGetter in
argument to Printer: *Bar does not implement StringerGetter (wrong
type for GetStringer method) had GetStringer() *Foo want
GetStringer() fmt.Stringer
ログイン後にコピー

この問題の解決策は、インターフェイスのメソッドを予期されるインターフェイスの種類と一致させることにあります。この場合、GetStringer メソッドは具象型の代わりに fmt.Stringer を返す必要があります。

<code class="go">func (b *Bar) GetStringer() fmt.Stringer {
    return &Foo{"foo"}
}</code>
ログイン後にコピー

または、次に示すように、必要なインターフェイスを実装し、具象型に委譲するラッパー型を作成することもできます。次の手法:

委任による型埋め込み:

<code class="go">type MyBar struct{ Bar }

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>
ログイン後にコピー

型ラッピング:

<code class="go">type MyBar Bar

func (b *MyBar) GetStringer() fmt.Stringer {
    return &Foo{"foo"}
}</code>
ログイン後にコピー

これらの手法具体的な型を直接変更することなく、シームレスにインターフェイスできるようになります。具体的な型をラップまたは埋め込むことで、必要なインターフェイス規約に準拠したカスタム型を作成できます。

以上が具象型の実装がインターフェイス メソッドで予期されるインターフェイス型ではなく具象型を返すと、Go がエラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!