問題タブ [contravariance]
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.
c# - サブクラス固有のデータを格納する必要がある配列を継承する最良の方法は何ですか?
次のような継承階層を設定しようとしています。
MotorcycleAxle オブジェクトのみを Motorcycle オブジェクトの Axles 配列に格納し、CarAxle オブジェクトを Car オブジェクトの Axles 配列に格納したいと考えています。問題は、サブクラスの配列をオーバーライドしてどちらか一方を強制する方法がないことです。理想的には、Motorcycle クラスには次のようなものが有効です。
ただし、オーバーライドするときは型が一致する必要があります。このアーキテクチャをどのようにサポートできますか? Axles メンバーがアクセスされる場所で、多くの実行時の型チェックとキャストを行う必要があるだけですか? 実行時の型チェックを追加するのは好きではありません。強い型付けとポリモーフィズムの利点が失われ始めるからです。WheelAttached および Left/RightWheelAttached プロパティはタイプに依存するため、このシナリオでは少なくともいくつかの実行時チェックが必要ですが、それらを最小限に抑えたいと考えています。
c# - なぜ継承は私が思うように機能しないのですか?
クライアント実装を作成するためにすべてを一緒にオーバーライドする必要がある相互に関連する抽象クラスのグループがあるため、いくつかの継承の問題が発生しています。理想的には、次のようなことをしたいと思います。
これにより、Dogクラスを使用するすべての人が自動的にDogLegsを取得し、Animalクラスを使用するすべての人がLegsを取得できるようになります。問題は、オーバーライドされた関数が基本クラスと同じ型である必要があるため、これがコンパイルされないことです。DogLegは暗黙的にLegにキャスト可能であるため、なぜそうすべきでないのかわかりません。これを回避する方法はたくさんあることは知っていますが、C#でこれが不可能/実装されていない理由についてはもっと興味があります。
編集:コードで関数の代わりにプロパティを実際に使用しているため、これを多少変更しました。
編集:答えはその状況にのみ適用されるため、関数に戻しました(プロパティの集合関数の値パラメーターの共分散は機能しないはずです)。変動してすみません!私はそれが多くの答えを無関係に見えるようにすることを理解しています。
c# - C# 4.0 ではジェネリック共分散と反分散はどのように実装されていますか?
私は PDC 2008 には参加しませんでしたが、C# 4.0 がジェネリック共分散と反分散をサポートすると発表されたというニュースを耳にしました。つまり、List<string>
に割り当てることができますList<object>
。それはどうしてですか?
Jon Skeet の著書C# in Depthでは、C# ジェネリックが共分散と反分散をサポートしない理由が説明されています。主に安全なコードを書くためのものです。現在、C# 4.0 はそれらをサポートするように変更されました。それは混乱をもたらすでしょうか?
C# 4.0 の詳細を知っている人はいますか?
c# - C#の共変性と反変性に新しいキーワードが必要なのはなぜですか?
ジェネリック型がC#4.0のCoまたはContraバリアントであることを示すために、outまたはinパラメーターを追加する必要がある理由を誰かが説明できますか?
私はこれがなぜ重要なのか、そしてなぜコンパイラーがそれを理解できないのかを理解しようとしてきました。
ありがとう、
ジョシュ
class - クラス継承に関する共分散と反分散
「共分散」と「反分散」という概念の意味は何ですか?
AnimalとElephant ( Animalから継承) の2 つのクラスが与えられた場合、 Elephant を Animals の配列に入れようとすると実行時エラーが発生するというのが私の理解です。特定の)アニマルよりも。しかし、Elephant が Animal プロパティを含むことが保証されていることを確認して、Animal を Elephant の配列に配置できますか?
java - Java ジェネリック メソッドのオーバーライド
オブジェクトを同じクラスのコピー先オブジェクトにコピーするためのインターフェイスを作成したいと考えていました。簡単な方法は、キャストを使用することです。
しかし、ジェネリックを使用してそれを行う方法も見つけました:
警告を取り除く唯一の方法は注釈です。そして、何かが間違っているように感じます。では、何が問題なのですか?問題の根本に何か問題があることを受け入れることができます。したがって、あらゆる種類の説明を歓迎します。
java - Scalaの変数宣言の一般的なワイルドカード
Javaではこれを行うかもしれません:
MyImpl implements MyInterface
...もちろん()と仮定します。
Scalaでこれを使用する場合のアナログは何Buffer
ですか?
これは(もちろん)コンパイルされませんが、どのようにすると、そのlist
ように変数を宣言できますか?
編集; もう少し追加します。違いは明らかに、JavaではジェネリックはTで共変ではないのに対し、Scalaでは共変であるかどうかに関係しているという事実と関係があります。たとえば、ScalaクラスList
はTで共変です(そして必然的に不変です)。したがって、以下がコンパイルされます。
私はまだコンパイラエラーに少し苦労しています:
Covariant type T occurs in contravariant position in ...
例えば; このコンパイラエラーは、クラス宣言で発生します。
別の質問をします...
generics - 例がコンパイルされないのはなぜですか、別名 (co-、contra-、および in-) 分散はどのように機能するのでしょうか?
この質問に続いて、誰かがScalaで次のことを説明できますか:
+T
型宣言におけるとの違いを理解してT
います ( を使用するとコンパイルされますT
)。しかし、それでは、パラメータ化されていないものを作成することに頼らずに、型パラメータが共変であるクラスを実際にどのように作成するのでしょうか? 次のものを のインスタンスでのみ作成できるようにするにはどうすればよいT
ですか?
編集-これを次のようにしました:
これで問題ありませんが、必要な型パラメーターは 1 つだけですが、2 つの型パラメーターができました。次のように再質問します。
型が共変である不変 Slot
クラスを作成するにはどうすればよいですか?
編集2:当たり前!私は使用var
していませんでしval
た。以下は私が欲しかったものです:
c#-3.0 - C#3.0 の Pub-/Sub-Scenarios で Co-/Contravariance をサポートする必要がありますか?
私のアプリケーションでは、サブスクライバーを登録するための何かを提供する単純なイベント ハブを作成しています。
そして出版イベント。
とてもシンプルです。Publish<int>(0)
を実装しているすべてのサブスクライバーにルーティングしたいISubscriber<int>
。
それほど難しくないのは、サブスクライバーの EventType を反変にすることです。したがって、ISubscriber<object>
基本的にすべてを消費する必要があります。値型も消費してほしいかどうかはわかりません。
C#4 では問題ありませんが、今は C#3 でこのようなことを行っており、インターフェイスで反変性を偽装しています。
さて、このように「イベント型」にデータを詰め込みたいと思います。そのイベントのジェネリック パラメーターは、共変でなければなりません。
パブリッシュするとPublish<DataChanged<B>>(new DataChanged<B>(new B())
(指定された B : A)、Subscriber にはDataChanged<A>
、データがどこに渡された B インスタンスであるかが通知されますDataChanged<B>
。したがって、共分散のサポートも必要です。
次のように、Co-/And Contravariance の両方をサポートするライブラリを作成することを考えました。
次のような変換(キャストではありません!)が可能になります:
どう思いますか?出来ますか?動的プロキシを使用してそれを行うことを考えました。