Código PHP:
class Auto {
public $TanqueGasolina = new TanqueGasolina();
public $Motor = new Motor();
// Funciones del Auto
}
El primer problema que tienes es que la clase carro crea las instancias de tanque y motor esto genera un poco de acoplamiento para ciertos casos.
Código PHP:
class TanqueGasolina extends Auto {
public $Gasolina = 100;
// Funciones del Tanque de gas
}
class Motor extends Auto {
public $Estado = "Apagado";
public function Encender() {
// AQUI EMPIEZAN MIS DUDAS
}
El problema en esta parte es que estas intentando usar la herencia como forma de reutilización en clases que no tiene nada en común, a esto se le conoce como
Refused bequest para resolver esto puedes usar composición o delegar la responsabilidad en otras clases. Por otro lado, algo que pasaste por alto es que estas explicando el problema que tienes pero no lo que realmente quieres hacer, pero con la información que proporcionaste y viendo el código puedes hacer algo como lo siguiente.
Código PHP:
Ver originalclass Tank {
private $level = 0;
public function level() {
return $this->level;
}
public function fill($quantity) {
$this->level = $quantity;
}
}
class Engine {
private $state = 'off';
private $tanke = null;
public function __construct(Tank $tank) {
$this->tank = $tank;
}
public function turnOn() {
if ($this->tank->level()) {
$this->state = 'on';
} else {
$this->state = 'off';
}
return $this->state;
}
public function turnOff() {
$this->state = 'off';
}
}
class Car {
private $tank;
private $engine;
public function __construct(Tank $tank, Engine $engine) {
$this->tank = $tank;
$this->engine = $engine;
}
public function turnOn() {
return $this->engine->turnOn();
}
public function turnOff() {
return $this->engine->turnOff();
}
public function fillGas($quantity) {
$this->tank->fill($quantity);
}
}
//ejemplo
$tank = new Tank();
$tank->fill(100);
$engine = new Engine($tank);
$car = new Car($tank, $engine);
$car->turnOff();
$car->fillGas(0);
Este ejemplo tiene mucho que mejorar pero la idea de utiliza delegación te simplifica el problema y obtienes un api mas sencilla de usar ademas cada objeto ya tiene su propia responsabilidad.
Si estas comenzando con la POO te aconsejo que leas sobre los principios GRASP para que aprendas como signar responsabilidades entre clases, un buen libro que habla sobre el tema es el de
craig larman