ジェネリックインターフェースの制約について
この時点で、ジェネリックインターフェースの制約について議論する価値があります。ジェネリックコンテナ型のインターフェースを定義したい場合があるかもしれません。例えば、セットデータ構造を必要とするアルゴリズムがあるとします。異なるトレードオフを持つ多くの異なる種類のセット実装があります。必要なセット操作のインターフェースを定義することで、パッケージに柔軟性を追加し、特定のアプリケーションに適したトレードオフを決定することをユーザーに委ねることができます:
type Set[E any] interface {
Insert(E)
Delete(E)
Has(E) bool
All() iter.Seq[E]
}
ここで自然な質問は、このインターフェースの制約が何であるべきかということです。可能であれば、ジェネリックインターフェースの型パラメータは制約として any
を使用し、任意の型を許可するべきです。
上記の議論から、理由は明らかであるべきです:異なる具象実装は異なる制約を必要とする可能性があります。これまで検討したすべての Tree
型、および OrderedSet
型は、これらの型が異なる制約を持っているにもかかわらず、要素型に対して Set
を実装できます。
インターフェースを定義する目的は、実装をユーザーに委ねることです。ユーザーが実装でどのような制約を課したいかを予測できないため、具象実装ではなくインターフェースに(any
より強い)制約を残さないようにしてください。