我有一个父类,它有一个最终的公共函数。是否可以禁止在派生类中访问此方法?从父类派生的其他类仍然需要能够调用它。
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();
答案 0 :(得分:3)
从类继承时,它意味着继承的派生类is a类。这意味着它具有完全相同的基本功能,可以扩展,覆盖等等。如果派生类具有在父类中定义的方法没意义,则意味着派生类不是它派生的类。
对于真实世界的示例,假设您的类FlyingMachine
具有方法Fly
和Move
,如果您从{{1}派生类Car
,则不合逻辑因为汽车不会飞,而从提到的基类派生类FlyingMachine
是完全没问题的。但是,如果您的基类AirPlane
具有方法Machine
并且汽车来自此类Move
(汽车是机器,对吗?),Car : Machine
,那将是合乎逻辑的。也是一台机器FlyingMachine
非常精细,因为飞机是一架飞行器FlyingMachine : Machine
是有道理的。
对于您给出的示例,这应该是:
AirPlane : FlyingMachine
修改强>
如果有一个功能,几个派生类需要,但对于其中一些,它应该是公共的,而其中一些不是。您应该在基类中将此方法定义为protected(派生类可以访问一个但不可能从外部访问)。并且在派生类中要求此方法是公共的,请创建另一个方法并调用父方法。 E.g:
abstract class VeryBaseClass {
public function MethodThatIsLogicalForEveryDerivedClass() {}
}
abstract class BaseClass extends VeryBaseClass {
public function SomeOtherFunctionThatMakesSenseOnlyForSomeClasses() {}
}
class ClassThatShouldNotHaveSpecificFunctionDefinedInBaseClass extends VeryBaseClass{}
class ClassThatShouldHaveSomeOtherMethod extends BaseClass {}
答案 1 :(得分:1)
如何在方法中检查该类,如果是不允许的类则抛出异常:
class ParentClass {
final public function test() {
if (get_class($this) == "ChildClass")
throw new Exception("ChildClass cannot call test()")
}
}
注意:这是相当邪恶的