ホームページ  >  記事  >  バックエンド開発  >  メソッドで文字列列挙をジェネリックパラメータとして使用するにはどうすればよいですか?

メソッドで文字列列挙をジェネリックパラメータとして使用するにはどうすればよいですか?

WBOY
WBOY転載
2024-02-10 14:21:17990ブラウズ

メソッドで文字列列挙をジェネリックパラメータとして使用するにはどうすればよいですか?

php エディター Youzi は、メソッドをジェネリック パラメーターとして使用して文字列列挙を使用する方法を紹介します。プログラミングでは、コードの柔軟性と再利用性を高めるためにジェネリックを使用する必要があることがよくあります。メソッドで文字列列挙をジェネリック パラメーターとして使用すると、コードをより簡潔かつ効率的にすることができます。次に、この関数の実装方法を詳しく説明し、具体的なコード例を示します。この興味深いプログラミング手法を一緒に探求しましょう。

質問の内容

共通の validate() メソッドを共有する複数の文字列派生列挙があります (すべて私の制御の範囲を超えています)。文字列をこれらの列挙型に変換し、結果の列挙型に対して validate() を呼び出す汎用メソッドが必要です。これを達成するためにジェネリックを使用しようとしましたが、さまざまな理由で失敗しました。

次の例では、型制約が強すぎるため、validate() を呼び出すことができません。また、validate() メソッドを使用して独自のインターフェイスを挿入し、それを型制約として使用しようとしましたが、型変換部分で失敗しました。

列挙型を変更せずにこれを実現するにはどうすればよいですか?

package main

// imagine i have multiple of those types outside of my control
type FooStatusEnum string

func NewFooStatusEnum(value FooStatusEnum) *FooStatusEnum {
    return &value
}

const (
    FooStatusEnumA FooStatusEnum = "A"
    FooStatusEnumB FooStatusEnum = "B"
    FooStatusEnumC FooStatusEnum = "C"
)

func (m FooStatusEnum) Validate() error {
    return nil
}

func stringToValidatedEnum[E ~string](s string) E {
    e := E(s)
    if err := e.Validate(); err != nil {
        panic(1)
    }
    return e
}

func main() {
    stringToValidatedEnum[FooStatusEnum]("A")
    e := FooStatusEnum("A")
    e.Validate()
}

Solution

string 基本型 および validate() メソッドを指定する型制約を使用します。 リーリー ### 試して: ### リーリー

これは出力されます (

go playground

で試してください):

リーリー

以上がメソッドで文字列列挙をジェネリックパラメータとして使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。