問題タブ [subtyping]
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++ - C++ で派生クラスを使用するための演算子のオーバーライド
サブクラスで仮想比較演算子をオーバーライドしようとしていますが、派生クラスが基本クラスの仮想演算子を実装していないというコンパイラ エラーが発生します。
私の派生演算子が基本クラスの引数の型を使用していないという事実に関係しているように感じます。
簡略化されたバージョンは次のようになります。
これを行う方法はありますか、それともDerived
実装で型チェックを行って正しい型かどうかを確認する必要がありますか?
covariance - Eiffel:引数として渡された共変の不正な型?
(私のものを強調)
フィールドと関数の共変再定義には問題はありませんが、 引数の共変再定義は、不正な型が引数として渡される可能性があるという問題を引き起こします。
しかし、フィールドと関数の型を共変に再定義しても問題が発生しない場合、引数の型を共変に再定義すると問題が発生するのはなぜでしょうか?
共変再定義はサブタイプ化と同じですよね? サブタイプはスーパータイプに取って代わることができます!
キャッチは何ですか?
scala - Scala ジェネリック リストの追加
私は機能を持っています:
上記のコード例は正常に動作しますが、以下の関数に変更するとエラーで動作しなくなります
パラメータの暗黙的な値が見つかりませんでした
abc: Numeric[AnyVal]
ベース型だからAnyVal
足し算できるんだよね?
すべての暗黙の定義はどこにありますか?
また、これは機能していません。同じ理由だと思います。
c++ - サブタイプの関数呼び出しはどのように実装されていますか?
私は現在プログラミング言語を設計しており、この問題を解決する方法に興味があります:
次のようなクラス (またはインターフェイス) A があるとします。
それを拡張し、次のように見える2番目のクラス B:
そして、次のような関数 f があるとします。
ただし、2 つの B で呼び出すと、second.a は 2 つの As で呼び出された場合と同じ場所にはなりません。これは、最初のパラメーターがそれをシフトするためです。これを解決するための私の現在の考えは次のとおりです。
- 不明なサイズのパラメーターを許可せず、ポインターまたは参照として渡すように強制します (これが Rust の機能だと思います)。
- 次のすべての情報をコール スタックに書き込みます。
- first と second の可能なサイズごとに関数を作成し、既知の場合はコンパイル時、または vtables を使用して実行時にどちらを呼び出すかを決定します。
2 番目のアイデアは、サブタイプを使用してほとんどまたはまったく呼び出されない場合でも、すべての関数でサポートされる必要があるため、問題になります。これは非効率的です。
3 番目のアイデアでは、多くの関数を作成する必要があります (20 の異なるサブタイプを持つことができる 5 つのパラメーターを受け入れる関数は、未知の型のパラメーターで 1 つだけ呼び出された場合、100 個の同様のコードを生成する必要があります)。それを使用する関数が 1 つだけあるクラスごとに vtable が必要になります。また、コンパイル済みのライブラリ内の関数は、新しいサブタイプでは使用できませんでした。
2 と 3 を組み合わせて、同じ関数の 2 つのバージョンを作成します。1 つは型のみを受け入れ、もう 1 つはサブタイプも受け入れるものです。これらの問題のいくつかは解決できます。
これに対するより良い解決策があるかどうか、および C++ などの他の言語がこれをどのように実装しているかに興味があります。