車の種類と燃料の種類の間に厳密な境界がある場合FillTank()
、基本Car
クラスにいることはできません。車を持っていることを知っていても、燃料の種類がわからないからです。したがって、これがコンパイル時に 正確であることを保証するFillTank()
には、サブクラスで定義する必要があり、機能するFuel
サブクラスのみを使用する必要があります。
しかし、サブクラス間で繰り返したくない共通コードがある場合はどうでしょうか? 次に、サブクラスの関数が呼び出す基本クラスの保護されたメソッドを記述します。 FillingTank()
同じことが当てはまりFuel
ます。
しかし、ディーゼルやガソリンなど、複数の燃料で走る魔法の車があるとしたらどうでしょうか。次に、その車は両方のサブクラスになり、オブジェクトに2つのインスタンスがないように、それが仮想スーパークラスとして宣言されていることを確認する必要がありDieselCar
ます. タンクへの充填は、ほとんどまたはまったく変更を加えなくても機能するはずです。デフォルトでは、との両方が得られ、タイプごとにオーバーロードされた関数が得られます。GasCar
Car
Car
DualFuelCar
DualFuelCar.FillTank(GasFuel)
DualFuelCar.FillTank(DieselFuel)
FillTank()
しかし、サブクラスに関数を持たせたくない場合はどうでしょうか? 次に、実行時チェックに切り替えて、必要だと思っていたことを実行する必要があります。サブクラス チェックFuel.type
を行い、不一致がある場合は例外をスローするか、エラー コードを返します (後者が望ましい)。C++ では、RTTI をdynamic_cast<>
お勧めします。パイソンでは、isinstance()
.