Ho letto queste domande:
- Informazioni sulla "programmazione su un'interfaccia"
- Qual è il punto di un'interfaccia?
- Ha sempre senso "programmare su un'interfaccia" in Java?
Non capisco come "programmare su un'interfaccia" se si utilizzano metodi in classi concrete che non fanno parte dell'interfaccia.
Mi rendo conto che l'esempio più comune di questo principio di progettazione è List
vs ArrayList
in Java perché è facile capire e illustrare il punto.
Ecco un esempio un po 'sciocco per illustrare ciò che la mia domanda sta ponendo (il codice è in PHP ma si applica alla maggior parte delle lingue OOP):
interface ResponseInterface {
public function getStatusCode();
}
class Response implements ResponseInterface {
private $status;
public function getStatusCode() {
return $this->status;
}
}
class AwesomeResponse implements ResponseInterface {
private $status;
private $message = ['200' => 'OK', '500' => 'Internal Server Error'];
public function getStatusCode() {
return $this->status;
}
public function getStatusMessage() {
return $this->message[$status];
}
}
class Server {
public function sendResponse(ResponseInterface $response) {
// this seems wrong -----^
header(vsprintf('HTTP/1.1 %d %s', [
$response->getStatusCode(),
$response->getStatusMessage()
]), true, $response->getStatusCode());
}
}
Come puoi vedere, il metodo sendResponse
accetta un parametro ResponseInterface
ma chiama getStatusMessage()
che non fa parte dell'interfaccia ma solo qualcosa implementato in AwesomeResponse
, che implementa ResponseInterface
.
L'applicazione si arresta in modo anomalo al runtime quando viene passato un oggetto Response
mentre prova a chiamare il metodo inesistente getStatusMessage()
. Pertanto, l'implementazione corretta sarebbe:
public function sendResponse(AwesomeResponse $response) {
// ...stuff
}
Ma AwesomeResponse
non è un'interfaccia, quindi come posso programmare su un'interfaccia?