問題タブ [covariance]
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#-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 の両方をサポートするライブラリを作成することを考えました。
次のような変換(キャストではありません!)が可能になります:
どう思いますか?出来ますか?動的プロキシを使用してそれを行うことを考えました。
c# - 異なる型パラメータ間の変換が許可されないのはなぜですか?
ある汎用コンテナを別のコンテナに変換すると非常に便利なので、わかりませんか?
c# - 継承でジェネリック クラスを作成する方法は?
次のコードを機能させるにはどうすればよいですか? C# のジェネリックをよく理解していないと思います。おそらく、誰かが私を正しい方向に向けることができます。
それはおそらく簡単な答えです。
更新: まず、これは C# 3.0 では不可能ですが、C# 4.0 では可能になります。
C# 3.0 で実行するには、これは 4.0 までの単なる回避策であり、次を使用します。
.net - .NET Framework 4.0 での型の相違
IEnumerable<T>
、IComparable<T>
およびさらにいくつかがタイプバリアントになりました。IList<T>
、ICollection<T>
および他の多くはそうではありません。なんで?
c# - ジェネリッククラスとインターフェースの非ジェネリックバージョン
ジェネリックインターフェイスまたはクラスを作成してから、このクラスまたはインターフェイスのさまざまなバージョンを非ジェネリックな方法で使用したいという状況に陥ることがよくあります。たとえば、私は次のようなインターフェースを持っているかもしれません:
これにより、クラスをそのタイプのファクトリにすることができます。次に、これらを一般的なファクトリクラスに登録したいので、次のように記述します。
辞書では、値にどのタイプを使用しますか?ある種の設計原理が欠けているかどうかはわかりませんが、これは共(ntra?)分散と多くの関係があることを認識しています。どんな助けやアイデアも大歓迎です。
c# - C#:リターンタイプのオーバーライド
C#でリターンタイプをオーバーライドする方法はありますか?もしそうなら、どのように、そしてそうでなければ、なぜそしてそれを行うための推奨される方法は何ですか?
私の場合は、抽象基本クラスとその子孫とのインターフェースがあります。私はこれをやりたいです(実際にはそうではありませんが、例として!):
RadioactivePoo
もちろん、から継承しPoo
ます。
これが必要な理由は、Cat
オブジェクトを使用する人Excrement
がにキャストすることなくプロパティをPoo
使用できるようにするRadioactivePoo
ためです。たとえば、ユーザーが放射性のうんちを必ずしも認識または気にしないリストCat
の一部である可能性があります。Animal
それが理にかなっていることを願っています...
私が見る限り、コンパイラは少なくともこれを許可していません。だから不可能だと思います。しかし、これに対する解決策として何をお勧めしますか?
c# - C#:分散(共分散/反分散)はポリモーフィズムの別の言葉ですか?
私は単語の正確な意味を理解しようとしており、Covariance
オンラインContravariance
のいくつかの記事と StackOverflow に関する質問から、理解できることから、それはポリモーフィズムの別の単語にすぎません。
上記のステートメントで正しいですか?それとも間違っていますか?
c++ - 共変仮想関数とスマートポインター
C ++では、戻り型が元の戻り型のサブクラスである限り、サブクラスは仮想関数をオーバーライドするときに別の戻り型を指定できます(両方ともポインター/参照として返されます)。
この機能をスマートポインターにも拡張することは可能ですか?(スマートポインタがいくつかのテンプレートクラスであると仮定します)
説明する:
編集:コンラッド・ルドルフが示唆したように、これは直接可能ではありません。しかし、私はこの方法に出くわしました:
このように行くことを提案しますか?