クラスから継承する場合、派生クラスは継承するクラスであることを意味します。これは、拡張、オーバーライドなどが可能な基本機能とまったく同じであることを意味します。派生クラスに親クラスで定義されたメソッドがあることが意味をなさない場合は、派生クラスが派生クラスではないことを意味します。
実際の例では、FlyingMachine
メソッドFly
とを持っているクラスがあるとしましょう。車が飛ばないため、からクラスMove
を派生させた場合、論理的ではありませんが、前述の基本クラスからクラスを派生させることはまったく問題ありません。しかし、メソッドを持つ基本クラスがあり、車がこのクラスから派生している場合(車は機械ですよね?)、機械でもあるので完全に問題ありません。飛行機は飛行機械なので、理にかなっています。Car
FlyingMachine
AirPlane
Machine
Move
Car : Machine
FlyingMachine
FlyingMachine : Machine
AirPlane : FlyingMachine
与えられた例では、これは次のようになります。
abstract class VeryBaseClass {
public function MethodThatIsLogicalForEveryDerivedClass() {}
}
abstract class BaseClass extends VeryBaseClass {
public function SomeOtherFunctionThatMakesSenseOnlyForSomeClasses() {}
}
class ClassThatShouldNotHaveSpecificFunctionDefinedInBaseClass extends VeryBaseClass{}
class ClassThatShouldHaveSomeOtherMethod extends BaseClass {}
編集:
いくつかの派生クラスに必要な機能があるが、それらのいくつかについては公開されるべきであり、いくつかについてはそうではない場合。基本クラスでこのメソッドを保護されたものとして定義する必要があります(派生クラスは1つにアクセスできますが、外部からはアクセスできません)。そして、このメソッドがパブリックであることを必要とする派生クラスで、別のメソッドを作成し、親のメソッドを呼び出します。例えば:
abstract class Car { protected function Shift() {} }
class ManualCar extends Car {
public function Shift() { parent::Shift(); }
}
class AutomaticCar extends Car {
//Some implementation of automatic car that uses protected Shift method
}
小さなデモ