Sealed Trait パターンは Rust でたまに使われるデザインパターンである。
トレイトの基底を『Voldemort パターン』で作成したトレイトにする事で、他クレートから使用はできるが、実装や派生はできないトレイトを作成する。
以下では、SomeTrait
の実装は f32
と f64
のみとなり、他クレートからの追加はできない。なぜなら、SomeTrait
の実装には、private::
の実装が前提になるが、クレート外ではその名前は使用できない。
pub(crate) mod private {
pub trait Sealed {}
}
pub trait SomeTrait: private::Sealed {
fn test(&self) {
// ...
}
}
impl private::Sealed for f32 {}
impl private::Sealed for f64 {}
impl SomeTrait for f32 {}
impl SomeTrait for f64 {}
トレイトの実装は後から増やせる。そのため、トレイトを扱う場合、それらに共通した一般的な動作について考えなければならない。
Sealed Trait パターンを使うと、トレイトを実装する型をクレート内で定義された型のみに限定できる。これにより、考察対象を減らす事ができる。
トレイトにデフォルト実装のないメソッドを追加すると、そのトレイトの実装箇所の全てで、そのメソッドの実装が必要になる。当然、外部クレートでの実装箇所についても作業が必要となるため、これはバージョン間の互換性に問題を生じさせる。
Sealed Trait パターンを使うと、トレイトの実装が外部クレートには存在しない事が保証される。そのため、気軽にメソッドを追加できる (追加以外、変更や削除では使用箇所への影響があるため、この限りでない)。