Когда вы унаследовали от класса это означает, что производный класс is a класс, который наследуется. Это означает, что он имеет ту же базовую функциональность, которая может быть расширена, переопределена и так далее. Если нет никакого смысла, чтобы производный класс имел метод, который определен в родительском классе, означает, что производный класс не является классом, который он получает.
Для реального мира, например, скажем, у вас есть класс 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 {}
Edit:
Если есть функциональность, что некоторые производные классы нужно, но для некоторых из них это должно быть публичным, и для некоторых из них нет. Вы должны определить в базовом классе этот метод как защищенный (производный класс может получить доступ к одному, но извне невозможно). И в производном классе, которые требуют, чтобы этот метод был общедоступным, выдает другой метод и вызывает метод родителя. Например:
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
}
Little demo
сделать его приватным – Ibu
@Ibu: Я не хочу запрещать вызов этого метода во всех производных классах. Я хочу запретить его в одном конкретном экземпляре, где вызов этого метода не имеет никакого смысла и приведет к нежелательному поведению. Другие производные классы должны иметь возможность вызвать функцию. – DudeOnRock
Просто используйте личное ключевое слово –