問題タブ [downcast]

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 投票する
4 に答える
2117 参照

c++ - ベース ポインターからテンプレート化された派生型へのダウンキャスト

次の階層があります。

base へのポインターが与えられたので、基になるものが派生 1 か派生 2 かを調べたいと思います。問題は、派生1と派生2の両方が多くの異なる型に特化できることです.dynamic_castを使用してダウンキャストをテストするには、テンプレートの型を知る必要があります. 私は厄介で、保守不可能で、不完全なコードのビットになってしまいました:

型の特殊化を処理できるより良い方法はありますか?

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

c# - POCOクラスでダウンキャスト

私はPOCOクラスのグループを持っています:

ReportBase を返す Web メソッドがあります。呼び出し元は、戻り値を使用して、型をダウンキャストしてチェックすることにより、実際の型に基づいて UI(WPF) を更新します (1 つのグリッドは販売用で、もう 1 つは購入用)。誰かが、3 つの Web メソッドを使用し、それぞれが特定の型を返すことを提案しました。

if/elseを導入することで、ダウンキャストは一般的に設計原則に反することがわかりました。代わりに、仮想関数を使用する必要があります。しかし、POCO クラスでは、実際には仮想動作はありません (追加のフィールドのみ)。

この場合、あなたはダウンキャストに賛成ですか反対ですか、なぜですか?

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

c++ - キューを介して情報を渡すときにダウンキャストを回避するにはどうすればよいですか?

私は、ユーザーが設定を変更してから情報をストリーミングすることにより、ハードウェアのビットと対話できるようにするツールを書いています。

これを行うために、いくつかのスレッドを実行EquipmentInterfaceしています。これらは。DataProcessorで接続されていQueueます。

EquipmentInterfaceスレッドには、機器の設定を変更するメソッドがあり(たとえばRotateRefocus、結果の情報(CurrentAngleおよびCurrentFocalDistance)がに追加されQueueます。設定が正しくなると、方法がStartStreamingありStopStreaming、ストリーミングが開始されると、機器からのデータがパケット化されてキューに追加されます。

BaseMessageキューに配置されるすべての情報は、メッセージタイプの表示を含む単一のクラスから派生します。次に、角度、焦点距離、ストリーミングの開始と終了、そしてもちろんデータ自体のメッセージタイプを導き出しました。

キューのDataProcessorもう一方の端をリッスンし、現在の角度/焦点距離に応じて、後続のデータを処理します。

これで、データプロセッサに、switchステートメントを使用して着信メッセージの型チェックを行う関数があります。これらのメッセージは、適切な型にダウンキャストされ、適切なハンドラーに渡されます。実際には、単一のキューをリッスンするDataProcessorだけでなく、実際には複数のキューに複数のリスナーがあります(ディスクに保存するものもあれば、GUIに情報を表示するものもあります)。情報を追加するたびに、新しいBaseMessage派生クラスを作成し、その基本クラスに新しい型を追加してから、新しいメッセージに対処するために各コンシューマーのswitchステートメントを更新する必要があります。

このアーキテクチャについての何かが私には間違っていると感じ、私は最近ダウンキャストについてたくさん読んでいます。私が見たものから、一般的なコンセンサスは、私がしていることは悪いコードの臭いであるということのようです。Boostを使用する提案を見たことがありますが、switchステートメントよりもきれいに見えません(何かが足りないのではないでしょうか?)。

だから私の質問は:私はswitch-statement / downcastingソリューションを避けようとしているべきですか?もしそうなら、どのように?

私の実装はC++/ CLIであるため、.netまたはC++ソリューションのいずれかが私が求めているものです。

編集-iammilindとstfaanvからのコメントに基づいて、これはあなたが提案している種類のものですか?

...そしてそれは単純化できますか?少し不格好な感じがしますが、それProcessMessagesが、switchステートメントと基本クラスのある種の列挙されたメッセージタイプ識別子なしでそれを行うことができる唯一の方法です。

0 投票する
5 に答える
1279 参照

java - ダウンキャストすると ClassCastException が発生します。どうすればこれを修正できますか?

プライベート メッセージ システムを実装しようとしています。これが悪い設計であるかどうか教えてください。しかし、私には と の 2 つのクラスがUserありRecipientます。RecipientですUserので継承しUserます。、、Recipientなどの追加のプロパティがあります。messageIdreadDatekeepMessage

私のコードは次のとおりです。

.

0 投票する
5 に答える
10313 参照

c# - C# で基本インスタンスを派生クラス (ダウンキャスト) にキャストする

2 つのクラスがあるとします。

C# ではダウンキャストできないため、次のようなものが機能しないことはわかっています。

私の質問は次のとおりです。効率的な方法でダウンキャストを達成するにはどうすればよいですか? 実際には、従業員をパラメーターとして受け取り、それを使用してその値を注入し、基本的にクローンを作成するコンストラクターが AdvancedEmployee にあります。


アップデート

重複するデータを解決するために、アプローチを少し変更し、AdvancedEmployee CONTAINS は従業員そのものではなく、従業員を含むようになりました。例:

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

c++ - dynamic_cast とポリモーフィズムのベスト プラクティス

最善の方法で処理する方法がわからないという設計上の問題があります。私は自分のコードが将来の証明であることを望んでいます。

現在、私のデザインには次の設定があります

クラスBはクラスと異なりA、クラスDとクラスはクラスと異なりE、クラスとは異なります。BCA

これらのクラスは異なるため、dynamic_cast演算子を使用する必要があります。

dynamic_cast見ての通り、たくさん使いたくなる!if()余分なステートメントでいっぱいではない、これを行うための良い方法を見つけようとする必要があります。

これを行うきちんとした方法はありますか?Scott Meyers の本で何かを見た覚えがあるようですが、私は家を離れており、1、2 週間アクセスできません。

参考文献/例は大歓迎です。

また、必要に応じてB、一種のソリューションとなるクラスをインターフェイスにすることもできます

しかし、理想的ではありません。

注: この例を追加して、現在の設計の失敗を示しました。

静的型 A はこの関数を知らないため、getObjectType1()アクセスすることはできません。dynamic_cast設計を再考する必要があります。何か案は?

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

c++ - ダウンキャストを回避する方法は?

各状態がイベントキューから取得したイベントを処理する状態パターンの実装があります。したがって、基本Stateクラスには純粋仮想メソッドがありvoid handleEvent(const Event*)ます。イベントは基本クラスを継承Eventしますが、各イベントには、異なるタイプ(int、stringなど)のデータが含まれています。イベントデータを抽出するにhandleEventは、受信したイベントのランタイムタイプを判別してから、ダウンキャストを実行する必要があります。イベントは動的に作成され、キューに保存されます(したがって、アップキャストはここで行われます...)。

ダウンキャストは悪い設計の兆候であることを私は知っていますが、この場合それを回避することは可能ですか?基本クラスのStateに各イベントの仮想ハンドラーが含まれるVisitorPatternを考えていますが、イベントをキューからデキューして現在の状態に渡すコードでダウンキャストを実行する必要があります。(少なくともこの場合、大きなswitch(eventID)ものは1か所だけになります...)。ビジターパターンは、ダウンキャストを回避するための最良の方法(ベストプラクティス)ですか?

これが擬似コードです(boost::shared_ptrこの例ではパスしていますが、とにかくダウンキャストが発生します):

0 投票する
5 に答える
751 参照

java - リストをサブクラスジェネリックから親クラスジェネリックにキャストするにはどうすればよいですか?

機能を追加するためにオープンJDKを変更していますが、これに2回遭遇しましたが、適切な解決策はありません。

JCStatementを拡張するという名前のクラスがありますJCTree

List<JCStatement>問題:をにキャストしたいList<JCTree>

クラスがその拡張機能の1つを参照できることは明らかですが、リストにある場合は機能しません。

私は使用しました:(List<JCTree>)((List<?>)params)キャストするために、これは機能しますが、antに基づいていません。IDEは私に次の警告を出します:

したがって、これは何らかの方法で回避する必要があります。

助けていただければ幸いです。

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

java - Java: スーパークラスを知っている場合のキャストに対するリフレクション

私の疑問を正確に定義する方法がわからないので、質問が既に出されている場合は、しばらくお待ちください.

オブジェクトを動的にインスタンス化する必要があるとしましょう。このオブジェクトは、既知の不変クラス A のサブクラスのインスタンスであることは間違いありません。特定の実装クラスを動的に取得できます。

ターゲットクラスについて何も知らないかのようにリフレクションを使用する方が良いでしょうか、それとも次のようなことを行うことが望ましい/可能でしょうか:

どこSub-A extends A?目的は、リフレクションのオーバーヘッド時間を回避することです...

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

python - Python (django) 汎用モジュール開発 - データベースに動的クエリセットを保存しますか? モデルの継承

最終的にリリースする予定の Python Django モデルのコンテキストで、興味深い設計上の決定を行う必要があります。

クラスは ApprovalRequest をモデル化します。これは、別のユーザー グループによって投票される可能性があるユーザーによって要求された質問/要求を表します。これは、上訴することもできます。その後、「より高いレベルの」グループなどによって再び投票することができます。

私は次のモデルツリーに相当するものを持っています:

  • ApprovalRequest (単一リクエスト)
    • ユーザーがアクションを要求しています
    • アクションタイプ* / 追加データ
  • ApprovalStage (場合によっては投票の多くの段階、時間的に順次)
    • 関連する承認申請
    • 投票の種類 (単純過半数、必要な 1 票など)
    • 投票できるユーザー*
  • ApprovalVote (1 人の投票者による 1 票)
    • 関連する承認段階

私の最初の質問は、「アクション タイプ」に関するものです。誰でも使える再利用可能なモジュールにしたいので、イベントが発生したときにシグナルを発するようにしたいです。ただし、このモデルは、モデレーション、ユーザー プロモーション、ユーザー禁止の再審査請求の決定など、多くの場合に機能します。そのため、ある種の「タイプ」パラメーターが必要です。OOP 設計でこれを解決する古典的な方法は、サブクラスを作成してカスタム アクションを持たせることですが、これは問題ありませんが、Django (特に) には、DB から「正しい」サブクラスを取得する簡単な方法がありません。たとえば、組み込みのモデル継承を使用すると、メインの ApprovalRequest db テーブルと、各子のデータ用の N 個の追加 db テーブルが存在します。

ここで最初に考えたのは、サブクラス「レジストリ」を作成することです。これにより、タイプ フィールドに一意の ID が割り当てられるため、タイプ固有のアクションを実行する必要がある場合に、登録済みのタイプに確実にダウンキャストできます。これにより、サブクラスはサブクラスの (プロジェクト全体の) id を選択することを余儀なくされ、一般的に洗練されていないように見えます。

2 つ目の質問は、「投票できるユーザー」に関するものです。これらの ApprovalRequest オブジェクトのほとんどは、たとえば Django 管理者によってではなく、実際にはコードによって作成されると思います。次のアクションが発生するとします。

  1. ユーザーがプロモーション (またはその他のアクション) をリクエストする
  2. ApprovalRequest オブジェクトが作成され、特定のコード依存グループ (つまり、複雑なクエリセット) に一致するすべてのユーザーが投票できるように指定されます。
  3. ApprovalRequest に対してアクションが実行されないまま時間が経過する
  4. 10 人の新しいユーザーが複雑なクエリセットの基準を満たしています (つまり、ApprovalRequest が作成されていれば、これらのユーザーも投票グループの一部になります)。
  5. これらの新しいユーザーが投票できるようにしたい

問題は、多かれ少なかれ、この複雑なクエリセットを安全な方法で保存するにはどうすればよいかということです。この作業を型に基づいてサブクラスに委譲することはできますが、それは洗練されていないように思えます。どうにかしてクエリセットをデータベースに保存することもできますが、それは少しハックなようです。選択する標準的なルートは何ですか?

これらの質問についてアドバイスをいただければ幸いです。