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如果您从中派生类是不合逻辑Car的,FlyingMachine因为汽车不会飞,而AirPlane从提到的基类派生类则完全没问题。但是,如果您有Machine具有方法的基类Move并且 car 是从该类派生的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 {}

编辑:

如果有几个派生类需要的功能,但对于其中一些,它应该是公共的,而对于其中一些则不是。您应该在基类中将此方法定义为受保护的(派生类可以访问一个但不能从外部访问)。并且在要求该方法公开的派生类中创建另一个方法并调用父方法。例如:

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()")
    }
}

注意:这是相当邪恶的

于 2013-02-08T07:09:29.903 回答