問題タブ [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# - サブクラス固有のデータを格納する必要がある配列を継承する最良の方法は何ですか?
次のような継承階層を設定しようとしています。
MotorcycleAxle オブジェクトのみを Motorcycle オブジェクトの Axles 配列に格納し、CarAxle オブジェクトを Car オブジェクトの Axles 配列に格納したいと考えています。問題は、サブクラスの配列をオーバーライドしてどちらか一方を強制する方法がないことです。理想的には、Motorcycle クラスには次のようなものが有効です。
ただし、オーバーライドするときは型が一致する必要があります。このアーキテクチャをどのようにサポートできますか? Axles メンバーがアクセスされる場所で、多くの実行時の型チェックとキャストを行う必要があるだけですか? 実行時の型チェックを追加するのは好きではありません。強い型付けとポリモーフィズムの利点が失われ始めるからです。WheelAttached および Left/RightWheelAttached プロパティはタイプに依存するため、このシナリオでは少なくともいくつかの実行時チェックが必要ですが、それらを最小限に抑えたいと考えています。
c# - なぜ継承は私が思うように機能しないのですか?
クライアント実装を作成するためにすべてを一緒にオーバーライドする必要がある相互に関連する抽象クラスのグループがあるため、いくつかの継承の問題が発生しています。理想的には、次のようなことをしたいと思います。
これにより、Dogクラスを使用するすべての人が自動的にDogLegsを取得し、Animalクラスを使用するすべての人がLegsを取得できるようになります。問題は、オーバーライドされた関数が基本クラスと同じ型である必要があるため、これがコンパイルされないことです。DogLegは暗黙的にLegにキャスト可能であるため、なぜそうすべきでないのかわかりません。これを回避する方法はたくさんあることは知っていますが、C#でこれが不可能/実装されていない理由についてはもっと興味があります。
編集:コードで関数の代わりにプロパティを実際に使用しているため、これを多少変更しました。
編集:答えはその状況にのみ適用されるため、関数に戻しました(プロパティの集合関数の値パラメーターの共分散は機能しないはずです)。変動してすみません!私はそれが多くの答えを無関係に見えるようにすることを理解しています。
c# - 継承されたメソッドの戻り値の型で共分散をサポートする言語は?
私は最初にこの質問をしましたが、答えを見つける際に、継承されたメソッドの戻り値の型の共分散に対する C# のサポートの欠如が私の元の問題であることがわかりました。それを発見した後、私はどの言語がこの機能をサポートしているのか知りたくなりました。
一番多く名前を挙げられる方の回答を受け付けます。
編集:ジョン・ミリキンは、多くの動的言語がこれをサポートしていることを正しく指摘しました。明確にするために:
静的/強く型付けされた言語のみを探しています。
c++ - ベクトルを取得するベクトルを期待する関数に
これらのクラスを検討してください。
この機能
そして最後に私のベクトル
derived
functionに渡したいのですBaseFoo
が、コンパイラが許可しません。ベクトル全体を a にコピーせずに、これを解決するにはどうすればよいstd::vector<Base*>
ですか?
c# - 派生型でオーバーライドできますか?
私の知る限り、C#2.0で次のことを行うことはできません
派生クラスでプロパティを「新規」として作成することで問題を回避しますが、もちろんそれはポリモーフィックではありません。
2.0で何か解決策はありますか? この問題に対処する 3.5 の機能はどうですか?
.net - 汎用リストをインターフェイス/基本クラス型のリストにキャストする方法はありますか?
私は、彼らが作成したクレイジーな状況でのインターフェースの使用法を誰かに見せようとしています. リストには関連のないオブジェクトがいくつかあり、各オブジェクトの 2 つの文字列プロパティに対して操作を実行する必要があります。プロパティをインターフェイスの一部として定義すると、インターフェイス オブジェクトを、それに作用するメソッド パラメーターの型として使用できることを指摘しておきます。例えば:
これで問題ないように思えますが、作業が必要なリストは、インターフェイスを型パラメーターとして宣言する必要はありません (すべきではありません)。ただし、別の型パラメーターにキャストできるようには見えません。たとえば、これは失敗し、その理由がわかりません:
メンバーを使用してこれを行うことができEnumerable.Cast<T>
ますが、.NET 2.0 でも機能するメソッドを探していました。これは可能であるように思われます。私は何が欠けていますか?
c++ - スマート ポインターで共変の戻り値の型を使用するにはどうすればよいですか?
次のようなコードがあります。
このコードはコンパイルされません。
ビジュアルスタジオで上げる
C2555: 仮想関数の戻り値の型のオーバーライドが異なり、共変ではありません
生のポインターを使用せずにboost::shared_ptr
返すと、コードがコンパイルされます (これは、C++ の共変の戻り値の型によるものだと理解しています)。問題は、 が から派生していないためであるboost::shared_ptr
ことがわかります。しかし、他のクラスで使用するために を返したいのですが、そうでない場合は、戻り値を戻り値の後にキャストする必要があります。 Ret1
boost::shared_ptr
RetInterface
boost::shared_ptr
Ret1
- 私は何か間違ったことをしていますか?
- そうでない場合、言語がこのようなものになっているのはなぜですか。このシナリオでは、スマート ポインター間の変換を処理するために拡張可能である必要があります。望ましい回避策はありますか?
c# - 子クラスの列挙子を親クラスの列挙子にキャストするのは間違っていますか?
ビルドに次のようなエラーがあります。
エラー 12 型 'System.Collections.Generic.IEnumerator< BaseClass>' を 'System.Collections.Generic.IEnumerator< IParentClass>' に暗黙的に変換できません。明示的な変換が存在します (キャストがありませんか?)
単純に捨ててはダメですか?
これは私のコードです:
私の質問は、この行を変更することはできますか?
に:
(悪い副作用なしで)?
受け入れられた回答:
関数を次のように変更しました (Jon Skeet の投稿を読んだ後):
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 の詳細を知っている人はいますか?