0

最終的なパブリック関数を持つ親クラスがあります。派生クラスでこのメソッドへのアクセスを禁止することは可能ですか?親クラスから派生する他のクラスは、それを呼び出すことができる必要があります。

class ParentClass {
    final public function test() {

    }
}
class ChildClass extends ParentClass {

}
class ChildClass2 extends ParentClass {

}

$child = new ChildClass();
$child2 = new ChildClass2();
// make this illegal:
$child->test();
// but not this:
$child2->test();
4

2 に答える 2

4

クラスから継承する場合、派生クラス継承するクラスであることを意味します。これは、拡張、オーバーライドなどが可能な基本機能とまったく同じであることを意味します。派生クラスに親クラスで定義されたメソッドがあることが意味をなさない場合は、派生クラスが派生クラスではないことを意味します。

実際の例では、FlyingMachineメソッドFlyとを持っているクラスがあるとしましょう。車が飛ばないため、からクラスMoveを派生させた場合、論理的ではありませんが、前述の基本クラスからクラスを派生させることはまったく問題ありません。しかし、メソッドを持つ基本クラスがあり、車がこのクラスから派生している場合(車は機械ですよね?)、機械でもあるので完全に問題ありません。飛行機は飛行機械なので、理にかなっています。CarFlyingMachineAirPlaneMachineMoveCar : MachineFlyingMachineFlyingMachine : MachineAirPlane : 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
}

小さなデモ

于 2013-02-08T06:51:29.103 に答える
1

メソッドでそのクラスをチェックし、許可されていないクラスの場合は例外をスローするのはどうですか。

class ParentClass {
    final public function test() {
        if (get_class($this) == "ChildClass")
            throw new Exception("ChildClass cannot call test()")
    }
}

NB:これはかなり邪悪です

于 2013-02-08T07:09:29.903 に答える