問題タブ [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.

0 投票する
2 に答える
4388 参照

c++ - 派生クラスと基底クラスの間のポインターからポインターへの変換?

次の C++ プログラムについて:

GCC は、最後の割り当てステートメントで次のエラーを生成します。

私の質問は2つの部分に分かれています:

  1. Child** から Base** への暗黙的な変換がないのはなぜですか?
  2. この例は、C スタイルのキャストまたはreinterpret_cast. これらのキャストを使用することは、すべての型の安全性を捨てることを意味します。これらのポインターを暗黙的にキャストするために、または少なくともstatic_cast代わりに使用できるように変換を表現するために、クラス定義に追加できるものはありますか?
0 投票する
1 に答える
626 参照

scala - Scalaサブタイピング+暗黙の変換の問題

私はscalazライブラリを使用してscalaのモナドで何かをしようとしていますが、サブタイピングでうまく機能させるのに問題があります。

私は自分のモナドを定義することから始めました。簡単にするために、それをアイデンティティモナドとします。

次に、いくつかの追加機能で拡張しました。

この追加機能により、ExtendedIdはもはやモナドではありません。

ここで、タイプのオブジェクトを:ExtendedId[A]として使用したいと思います。Id[A]

ExtendedIdはモナドではないので、出力として取得できる最高のものはであると理解していることに注意してください。それで問題ありませんId[Int]。しかし残念ながら、そのコードはまだコンパイルされません。

ただし、これは次のことを行います。

ここで、asId関数は引数をfromからにアップキャストするだけExtendedId[A]ですId[A]。完全に冗長なはずですが、そうではありません。

なぜこうなった?Id[A]を含むオブジェクトへの暗黙の変換が存在し、からへmapの些細な暗黙の変換が明らかに存在します。では、なぜコンパイラーはそれらを組み合わせることができないのですか?ExtendedId[A]Id[A]

0 投票する
4 に答える
3988 参照

java - Java で Message クラスのサブタイプを実装するにはどうすればよいですか?

これは基本的な OOP の質問だと思います。完全に異なるメッセージ形式がいくつかあるメッセージ パッシング システムを設計していますが、それらすべてを PriorityBlockingQueue に配置できるようにしたいと考えています。最初に考えたのは、 を定義してabstract class Messageから、各メッセージ タイプの Message を拡張するサブクラスを定義することでした。ただし、これは、受信側で、メッセージ プロセッサがメッセージの内容を処理する方法を知るためにサブクラスを識別する必要があることを意味します。そして、私がこれを行う唯一の方法は.instanceof()orClass.を使用することであり、どういうわけか正しくないようです。

スコット・マイヤーズが書いているように、

「オブジェクトが T1 型の場合は何かを行い、T2 型の場合は別のことを行う」という形式のコードを書いていることに気付いたときはいつでも、自分を叩いてください。

(彼は続けて、ポリモーフィズムでは、サブクラスごとに異なる実装を持つ同じメソッド名を使用する必要があると主張しています。私の場合、そのアイデアを機能させる方法がわかりません-メッセージタイプ自体はまったく無関係です.)

議論のために、ここに私のメッセージタイプがあります:

  • ConsoleObject と ObjectState を識別する ConsoleMessage。
  • CardReaderRequestMessage には何も含まれていませんが、単に「次のカード」を要求しています
  • byte[80] カード イメージと Last Card インジケータを含む CardReaderMessage
  • byte[80] カード画像を含む CardPunchMessage
  • CardPunchResponseMessage には、カード イメージがパンチ バッファにコピーされたことを示す以外は何も含まれていません。

私は自分が扱っているメッセージの種類を知る必要があると信じているので、ポリモーフィック メッセージを使用するべきではないと思います。これを適切に設計するにはどうすればよいですか?

===== 編集してフォローアップの質問をする =====

私は、ある時点でそのサブクラスを特定することなく、ポリモーフィック メッセージを使用する方法を見つけようとしていました。提案されたアプローチはprocess()、各サブクラスでメソッドをオーバーライドすることでした。これが私の(単純化された)抽象メッセージと2つのサブクラスです:

すべての「インバウンド」メッセージに対して、スレッドごとに 1 つのキューがあります。スレッドがコンソールからのメッセージを「再開」するのを待つ必要があるが、その間に他のメッセージ タイプを受信して​​処理する必要があるとします。

しかし、今は何ですか?process() の一部の実装により、一部のデータがどこかに移動されましたが、最終的には次のように記述できる必要があります。

これは基本的に、「msg」が属するクラスを見つけることを意味します。

私はこれにすべて間違って近づいていますか?「イベント駆動型」モデルでは「待機」はあまり適切ではないことを認識していますが、これは長時間実行されるバックグラウンド ワーカーです。おそらく、process() を使用するという考えは、イベント駆動型スレッドを導く FSM の状態を変更するのにより便利でしょうか?

0 投票する
3 に答える
133 参照

c# - 「違法な」サブタイピングについて警告するコードコントラクトを取得できますか?

この質問が長すぎると思われる場合は申し訳ありません。質問する前に、それがどこから来ているのかを示す必要があります。

設定:

次の不変タイプが与えられますRectangle

…それから型を導き出すことは完全に合法のようですSquare

…派生クラスは、それ自体の不変条件が違反されないようにすることができるためです。

Rectangleしかし、私が可変にするとすぐに:

…との独立したセッターを持つべきではないSquareので、私はもはやそれから派生するべきではありません。SquareWidthHeight

質問:

Square可変Rectangleクラスから派生するとすぐにコントラクト違反を警告するように、コードコントラクトで何ができますか?できれば、コードコントラクトの静的分析により、コンパイル時にすでに警告が表示されます。

言い換えれば、私の目標は、コードコントラクトを使用して次のルールをエンコードすることです。

  • Widthおよびのは、互いに独立して変更Heightすることができます。Rectangle
  • WidthHeightのはSquare互いに独立して変更することはできず、そもそもそれは意味がありません。

…そして、これらのルールが「衝突」するたびにコードコントラクトが気付くような方法でそれを行います。

私がこれまで考えてきたこと:

1.不変条件をRectangle:に追加します

このアプローチの問題は、不変条件が「幅と高さは等しい必要はありませんが、等しくなる可能性があります」と正しく述べている一方で、(1)トートロジーであるため、(2)それがWidth == Height派生クラスの不変条件よりも制限が少なくなりSquareます。おそらく、コードコントラクトがそれを見る前に、コンパイラによって最適化されているのかもしれません。

Rectangle2.のセッターに事後条件を追加します。

これにより、派生クラスが変更されるたびにSquare更新Heightされることは禁止され、その逆も同様です。それ自体がからクラスを派生することを妨げることはありません。しかし、それが私の目標です。コードコントラクトに、可変から派生してはならないことを警告してもらうことです。WidthWidthSquareRectangleSquareRectangle

0 投票する
1 に答える
264 参照

scala - 型クラスとサブタイピング

型クラスを定義する次のコードがあります。

今、私が持っている場合、私はの代わりtoFoo(List(new A, new B)に取得します。タイプのクラスではなく、メソッドが使用されていることを確認するにはどうすればよいですか?List("A", "A")List("A", "B")BtoFooAToFooB

0 投票する
1 に答える
5410 参照

scala - Java と Scala のジェネリックについて

一般的なサブタイピングに混乱しています。

Java では、 typeAが のサブタイプである場合B、ジェネリック型C<A>でありC<B>、不変です。たとえば、ArrayList<Base>は のサブタイプではありませんArrayList<Derived>

ただし、Scala では、ジェネリック型C<A>とは、型が のサブタイプであるC<B>場合、共変です。では、Scala にはあるが Java にはないジェネリック クラスのプロパティは何ですか?AB

0 投票する
0 に答える
156 参照

scala - Scala の <:< および =:= 演算子はどのように使用され、それらの Predef 実装はどのように機能しますか?

重複の可能性:
Scala 2.8 では <:<、<%<、および =:= は何を意味し、どこに文書化されていますか?

明らかに <:< と =:= は、2 つの型がサブクラスの関係にある、または等しいことを表明するために使用されます。しかし、ドキュメントはそれらがどのように使用されているかを明確にしておらず、それらが完全に記号で構成されているため、Google でそれらを検索することはほとんど不可能です. (そのようなシンボルグーの名前が悪い考えであるもう 1 つの理由。)

また、Predef での実装はどのように機能しますか? Scala ではこのように型に作用する演算子を作成できるとは知らなかったので、それらが組み込みではないことを知って非常に驚きました。Scala のどの機能でこれができるのでしょうか? また、Predef の実装は完全に不透明です。ここでコンパイラの魔法が起こっていますか?

0 投票する
4 に答える
254 参照

haskell - Haskellでのデータ型の使用

以前の質問の続きになったので、これを新しい質問に始めました。

同様のコンストラクターで構成される2つのデータ型がある場合:

どういうわけかこれを次のように表すことができる方法はありませんか?

あなたが私がしていることを見ることができるなら-私はXをグループ化しようとしています| Yを1つのデータ型に変換し、他の複数のデータ型で使用できるようにします。コンパイラにこれを許可させることができないようです。許可する場合、XまたはYに対してパターンマッチングを行うことができず、Cのみですか?

Cが複数回宣言されたというエラーメッセージが表示されます。

タイプを使用できると思いましたが、複数のタイプを使用することはできません。

編集

私が長い道のりを宣言したとしても(以下のように)、それはまだコンパイルされず、XとYには複数の宣言があると言います:

0 投票する
1 に答える
1518 参照

inheritance - パラメトリックポリモーフィズムとサブタイプポリモーフィズムF#

これら2つのF#型シグネチャの違い(ある場合)は何ですか?

この場合、それらは同じことを意味しますか?

msdnは、(:>)タイプ制約について次のように述べています

これは、2つの署名が同じことを言っていることを示します。機能的には、それらはどのように異なりますか?

0 投票する
1 に答える
248 参照

scala - 継承による不変データ構造の更新

私は戦略的なゲームを作っており、学んだことを応用し、不変のデータを使用しようとしています。私のゲームにはユニットがあり、これらのユニットは異なる特別な機能を持つことができます。たとえば、一部の飛行機は自分自身を隠すことができます。私が探しているのは、ある種のことができる方法です

コピーして貼り付ける必要はありません:

Hidable を mixin するすべてのケース クラスで。