最近、(私にとって)不可解な問題を発見しました: クラス C 1 ...C_ nの階層があるとしましょう。少なくともいくつかのクラスは複数の (直接の) 子クラスを持ちますが、複数の親を持つクラスはありません (つまり、多重継承はありません)。階層の動作を変更したいと思います。私の最初の衝動は、サブクラス D 1 ...D nを作成し、必要に応じてメソッドをオーバーライドすることですが、1 つの問題があります。新しくオーバーライドされたメソッドを呼び出す場合、実際の D iを正式な D 1 (または中間のレベル); これは、サブクラス化することで解決できます。ただし、変更されていないメソッドを呼び出すときは、実際の D iを正式な C として渡す必要があります。C1 -> D1 -> D2 ...
iであるため、各 D iを Ci から直接導出する必要があります。このなぞなぞを解決するエレガントな、または一般的に受け入れられている方法はありますか? もしそうなら、多重継承に頼らない方法はありますか?
これを実現する一般的な方法がない場合、元の C 階層の作成者は特定の規則に従ってこの可能性を提供できますか?
より実用的なアプローチを好む人のために、元の階層は Ada で SOAP を実装します。私は XML-RPC に取り組んでいます。抽象的な観点から見ると、SOAP は XML-RPC のスーパーセットですが、実際の "通信中" の XML はまったく異なります。原則として、いくつかのデータ型を捨て (たとえば、XML-RPC には 1 つの整数型と 1 つの浮動小数点型があり、SOAP にはそれぞれいくつかの型があります)、残りの型を変換するルーチンを置き換えて、ほとんどの作業を実行できます。 XMLから。ただし、前述の継承の問題により、SOAP 階層のほぼ全体をコピーすることになりました。私が適切に再利用できた唯一のコードは、HTTP 部分であることが判明しました (SOAP オブジェクトではなく、テキスト ペイロードだけに関係していないため)。
[編集: より一般的な問題には当てはまらない単純な解決策を可能にする単純化の仮定を削除しました]