1

コード内のすべてのdynamicCastをQTのobjectCastに置き換えようとしています。しかし、私はちょっとした問題に遭遇しました。これが私のオブジェクトの階層です:

class ABase : public QObject

class IAbility; // Registered as Qt Interface
class ISize; // Registered as Qt Interface

class Derived : public ABase, public IAbility, public ISize; // Uses Q_INTERFACES

objectCastを使用して、DerivedをISizeまたはIAbilityに変換できます。ただし、コードの1つのポイントで、次の変換を実行したいと思います:Derived->ISize->IAbility。その最後のキャストでエラーが発生します。IAbilityはISizeとはまったく関係がないため、問題が発生する可能性があります。この時点でダイナミックキャストを行うことはできますが、したくありません。

4

1 に答える 1

3

私が見ているように、3つのオプションがあります。

  1. 2つのインターフェイスを継承階層に配置し、一方が他方を継承できるようにすることで、2つのインターフェイスを相互に関連付けます。これにより、一方から他方へ、一方​​向にキャストできますが、2つの間に実際の現実がない場合は、不器用で不安定になります。
  2. 他の2つが継承するスーパーインターフェイスを作成し、必要に応じて、それを共通のキャストグラウンドとして使用します。これにより、スーパーインターフェイスを使用して、オブジェクトを2つの方法でキャストできますが、不必要な抽象化も作成されます。
  3. DerivedオブジェクトをISizeにキャストし、必要な操作を行ってから、同じ派生参照をIAbilityにキャストします。したがって:派生-> ISize、派生->IAbility。

オプション3を選択します。これは、抽象化の観点から、最も強制力の少ないソリューションだからです。

于 2010-09-18T15:09:36.997 に答える