問題タブ [companion-object]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - コンパニオン オブジェクトを持つ Scala 型エイリアス
私は比較的新しい Scala ユーザーで、自分のコードの現在の設計について意見を求めたいと思っていました。
すべて固定長 Vector[Byte] (最終的にはバイト文字列を必要とする学習アルゴリズムで使用されます) として表されるクラスがいくつかあります。たとえば、A、B、および C です。これらのクラスを A と呼びたいと思います。 、B および C は、読みやすくするためにパッケージ内の他の場所に配置されています。これらのメソッドのために、Vector にクラス メソッドを追加する必要はありません。したがって、extend-my-library パターンはここでは役に立たないと思います。ただし、毎回ラッパー オブジェクトに「ドリル」する必要なく、Vector に付属する便利な関数メソッドをすべて含めたいと思います。ここでは効率が重要であるため、ラッパーの追加重量も必要ありませんでした。
したがって、パッケージ オブジェクトで型エイリアスを定義することにしました。
ただし、それぞれに独自の固定長があり、それらを作成するためのファクトリ メソッドを含めたいと思います。これがコンパニオン オブジェクトの目的のようです。これが私の最終的なデザインの外観です。
すべてがコンパイルされ、次のようなことができるようになります。
型エイリアスのコンパニオン オブジェクトを記述することに対して特に警告するものは見つかりませんが、型エイリアスの使用方法に反しているようです。また、これらの 3 つのクラスはすべて、理想的には分離する必要がある場合でも、同じファイルで定義されることを意味します。
- このアプローチに隠れた問題はありますか?
- この問題に対するより良い設計はありますか?
ありがとう。
scala - 型のコンパニオン オブジェクトへのアクセス
ある種の変数があり、コンパニオン オブジェクトから情報を取得したいと考えています。たとえば、次のようなことができるのではないかと考えました。
しかし、これはかなり冗長であり、 との比較minVal
が:Long
複雑になりi: I
ます。
簡潔で直接的な何かを見つけたいと思っていましたが、これには熟考が必要であると思われますが、それはしばしばどちらでもありません.
scala - 間違った前方参照ですが、Scala スクリプトは完全に実行されます
IntelliJ の Scala プラグインの最新バージョンを使用しており、次のコードを使用しています。その目的は、クラスのインスタンスを列挙できるようにすることですCount
。
コンパニオン オブジェクトのメソッドid()
を参照すると、IntelliJ は前方参照エラーを返しますが、スクリプトは完全にコンパイルされ、出力が生成されますVector(Count0, Count1, Count2)
。実際、スクリプトを正常に実行した後、たまたまエラーに気付きました。何を与える?
kotlin - kotlin、定義済みのクラス コンパニオン オブジェクトに拡張機能を追加する方法
既に定義されているクラスのコンパニオン オブジェクトに拡張機能を追加したい
また、インターフェースでも同じことをするのが好きです。
コンパニオンオブジェクトを持たないクラスではなく、ユーザー定義クラスのコンパニオンオブジェクトの拡張関数を定義するための構文を見つけるためだけに、ドキュメントを参照しました
kotlinでこれを行う機会はありますか?
scala - オブジェクトのコンパニオン クラスのオブジェクトを返すメソッドを定義する特性を混合するコンパニオン オブジェクトを作成します。
抽象的な問題: クラスのコンパニオン オブジェクトに混合できる特性を作成して、そのオブジェクトにそのクラスのオブジェクトを返すメソッドを提供します。
具体的な問題: 次のように、自分自身をシリアル化および逆シリアル化する方法を知っている、RESTful サービス呼び出しで使用するための一連のクラスを作成しようとしています。
使用目的は次のようになります。
Genson
グローバルオブジェクトを介してアクセスするシリアライゼーション/デシリアライゼーションを行うために使用しています。
次に、特性を次のように定義します。
これはコンパイルされます。しかし、これはしません:
次のエラー メッセージが表示されます。
次のように、単一の特性を作成しようとしました。
宣言しただけでは、コンパニオン オブジェクトではなく、 クラスのインスタンスだけがそのメソッドを持っているため、case class Foo (...) extends JsonSerialization[Foo]
呼び出すことができません。Foo.fromJson
Foo
宣言object Foo extend JsonSerialization[Foo]
すると、コンパイルできFoo
、.fromJson
メソッドが作成されます。しかし、実行時に、 への呼び出しは、それがではなく であるとfromJson
考えます。または、次の実行時エラーが示唆しています。T
JsonSerialization
Foo
そして、私は得るので宣言することはできませobject Foo extends Foo
ん
したがって、コンストラクターパラメーターを追加してみると、コンパイルして実行できますが、逆シリアル化しようとしたときのランタイムタイプが間違っているため、上記のエラーが発生します。
私ができる唯一のことはfromJson
、すべてのコンパニオン オブジェクトで定義することです。しかし、それを特性で定義する方法がなければならず、その特性を混ぜるだけです。右?
scala - コンパニオン オブジェクトによる継承
現在、次のように見えるいくつかのモデルをリファクタリングしようとしています。
このようなものに:
私がこれを行うことができるように:
すべてのモデルで暗黙的な読み取り値を定義する必要がありますが、抽象クラスのコンパニオン オブジェクトでこれを示す方法がわかりません。
scala - コンパニオン オブジェクトにおける Scala の暗黙的な型クラスの優先順位
このコードをコンパイルすると、次のエラーが発生します。
コンパニオン オブジェクトの が のオブジェクトよりも優先implicit def
されないのはなぜですか?Subtrait
Supertrait
サブトレイトimplicit def
のコンパニオン オブジェクトの s が、スーパートレイトのオブジェクトよりも優先されることを望みます。
アップデート
LowPriorityImplicits
トリックも機能しません。Scala の暗黙的なインスタンスでの優先順位の適用を参照してください。
scala - 基本クラスの保護されたメンバーへのアクセス
私は継承をそれほど頻繁に使用していないので、なぜ機能しないのかよくわかりません。私のプロジェクトでは、次のものがあります。
保護されたメンバーを持つ基本シール クラス:
そして、それはいくつかのロジックを持つ子孫です:
上記をコンパイルすると、次のエラーが発生します。
スーパークラスから保護されたメンバーを呼び出す際の問題が何であるかはよくわかりません...しかし、それをコンパニオンオブジェクトにラップすると、より興味深いものになり、問題が魔法のように修正されます:
scala - ケースクラスのコンパニオンオブジェクトを非推奨にする方法は?
ケース クラスが廃止された場合、そのコンパニオン オブジェクトは廃止されていないことに気付きました。
A(0)
の場合とまったく同じように、 の警告を受け取りたいと思いますnew A(0)
。コンパニオン オブジェクトを明示的に定義して非推奨にする必要がありますか? もっと良い方法はありますか?