-3

たとえば、オブジェクトデザインにすでにCarクラスがあり、コンバーチブルの車のオブジェクトがいくつかあるとします。

Convertible別のクラスとサブクラスを定義することもできますが、たとえば、後でサブクラスでもあるCarクラスを作成し、後で、それでもあるクラスがある場合、それをどのように処理できますか?FourWheelDriveCarFourWheelDriveConvertible

上記のデザインは、クラスのフラグまたはプロパティと同じように、クラス内のブール値、およびクラスisConvertible内のブール値である他のデザインと比較してどうですか。したがって、この場合、追加のクラスを定義しません。CarisFourWheelDriveCarCar

更新:実際の例では、私たちのプロジェクトではCredential、ユーザーの情報を格納するクラスがありました:user_id、encrypted_pa​​ssword、email_addressなど。Facebook、Gmail、Yahoo、MySpace(JanRainを使用)、同僚からのログインを許可する場合サブクラス化するこれらすべてのクラスを追加することFacebookCredentialを提案しましたGmailCredentialYahooCredentialCredential。クラスがたくさんあることに少し圧倒されました。メソッドを見るときは、サブクラスがそれをオーバーライドするのか、それとも基本クラスのメソッドなのかを確認する必要があります。コードを使用してクレデンシャルのプロバイダー(Facebook、Gmailなど)を通知し、このプロバイダーコードを使用して適切な処理を実行します。(たとえば、一部のプロバイダーは電子メールアドレスを確認しましたが、一部は確認していません)。ですから、同僚の方法がより適切か複雑かはわかりません。

4

4 に答える 4

2

http://en.wikipedia.org/wiki/Strategy_patternを使用して、別のアプローチをとる ことができます。さまざまなタイプの車にさまざまな動作を定義できるため、サブクラスが多くありません。

于 2012-04-22T23:24:39.127 に答える
1

多重継承をサポートしていない言語を使用していることを意味します。言語はインターフェースをサポートしていますか?基本抽象クラスを持つことができますCar。(「車」を作成することはなく、代わりに車の特定の実装を作成するため、抽象的です。)次に、抽象基本クラスを継承するクラスのインスタンスは、共通のインターフェースを実装できます。

  • IConvertible
  • IFourWheelDrive
  • IHybrid
  • 等々...

抽象基本クラスは、最も単純なものを定義するという考え方です。インターフェイスはそれがどのタイプであるかを定義し、確かに重複する可能性があります。これらのインターフェイスには、そのタイプに固有の操作とプロパティが含まれます。(AnIConvertibleには、非コンバーチブルにはないプロパティとメソッドがありIHybrid、などと同じです。)次に、特定の実装によって、全体に独自のセンスを追加できます。

ご存知のように、これは少し不自然な例です。だから、それはすべて推測です。しかし、この特定の理論的な実装では、インターフェイスを使用します。

于 2012-04-22T23:25:25.130 に答える
1

コンバーチブルでもある四輪駆動車についての懸念に加えて、次のことを考慮してください。

  • すべてのコンバーチブル車ですか?
  • すべての車両に四輪駆動車がありますか?

私にとって、これらの種類の質問は、これらがタイプを定義しない車の属性であることを示しています。ある意味、色やドアの数などと何ら変わりはありません。

于 2012-04-22T23:30:30.740 に答える
0

それは基本的に、それがコンバーチブルであるか四輪駆動であるかに基づいて、クラスの機能を変更する必要があるかどうかという問題に帰着します。たとえば、コンバーチブルと4輪駆動が必要/必要な場合は、継承をraise_top使用してそれらを含むクラスを追加する必要があります。そのような場合、そうです、オープントップの4WD車がコンバーチブルと4輪駆動の両方のクラスから継承する可能性はかなりあります。そのため、C ++でこれを行う場合、これらのクラスはおそらく仮想的に(または基本クラスに名前を付けたものから)継承する必要があり、Javaのようなものでは、クラスではなくインターフェイスである必要があります。lower_toplock_hubsunlock_hubsautomobile

一方、特定の車両がコンバーチブルであるかどうか、および/または4輪駆動であるかどうかを確認する必要がある場合は、クラス内の単純なブール(または列挙)フィールドで十分です。

于 2012-04-22T23:44:53.263 に答える