私はクラス階層を設計しています。クラス階層は、いくつかの特性とともに基本クラスで構成されています。基本クラスはいくつかのメソッドのデフォルト実装を提供し、形質はabstract override
によって特定のメソッドを選択的にオーバーライドし、スタック可能なtraits/mixinsとして機能します。今、設計の観点から形質を暗黙的な "コンストラクタパラメータ"として宣言するには?
これがうまく機能、およびドメインにマップ私はここから述語(別の形質)とここからフィルタリング機能(1つの形質)を追加できるように、など
にしかし、私は、暗黙的なパラメータを取るために私の特性のいくつかが好きです。私はこれがまだデザインの観点からは意味があり、実際には紛らわしいとは思わないことがうれしいです。しかし、私はそれを実行するコンパイラを説得することはできません。
この問題の中核は、形質にコンストラクタ引数を指定できないため、暗黙的にマークすることができるようです。メソッド実装内の暗黙的なパラメータの参照は、予期した "暗黙の値を見つけることができませんでした"というメッセージでコンパイルできません。私は
implicit val e = implicitly[ClassName]
経由でメソッド内で利用可能に(実際には、それがスコープ内に常にあります、)建設段階から暗黙的に「伝播」しようとしたが、定義することを(は間違いないとして、あなたの多くが期待して)同じメッセージで失敗しました。
ここでの問題は、コンパイラにimplicit ClassName
フラグを付けると、呼び出し元(つまり、特性をオブジェクトに混ぜたもの)が暗黙的に。現在私の呼び出し元はですが、コンパイラはこのレベルでチェックしていません。
特定の暗黙のは、建設時に利用できるように必要なものとして形質をマークする方法はありますか?
(そうでない場合、これは単にまだ実装されていないか、これは非現実的である理由深い理由があるのですか?)
これは、匿名オブジェクトで明示的に 'implWrap'を定義することはありません。なぜなら、それは特性の抽象フィールドなのですから? (もしそうでなければ、私はそれがどのように設定されているのか理解できません;あなたは気になりますか?) –
はい、コメントを見てください:暗黙的に使用したい場合、 'val implWrap = ClassNameW'と書くことができます。私はそれを行うより良い方法はありません:あなたが質問で言及しているように、形質は暗黙的にマーキングできるコンストラクタパラメータを持っていません。 –
もちろん、私はもっと良い解決策を見てとてもうれしいです。 –