Sealed Trait パターンは Rust でたまに使われるデザインパターンである。

トレイトの基底を『Voldemort パターン』で作成したトレイトにする事で、他クレートから使用はできるが、実装や派生はできないトレイトを作成する。

使用例

以下では、SomeTrait の実装は f32f64 のみとなり、他クレートからの追加はできない。なぜなら、SomeTrait の実装には、private::Sealed の実装が前提になるが、クレート外ではその名前は使用できない。


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 パターンを使うと、トレイトの実装が外部クレートには存在しない事が保証される。そのため、気軽にメソッドを追加できる (追加以外、変更や削除では使用箇所への影響があるため、この限りでない)。