Il metodo PHP di classe estesa richiede la stessa firma incluso il requisito di classe oggetto? [duplicare]

1

Non sei sicuro di come esprimere la domanda in modo sintetico per il titolo.

Ho una classe raccolta che estende un'altra classe di raccolta.

La classe raccolta genitore ha un metodo addMember(someClass $obj) che aggiunge un oggetto alla raccolta.

La classe dell'insieme figlio raggruppa oggetti della classe figlio di someclass , someClassChild . Pensavo che la firma del metodo di una classe figlia avrebbe superato il raduno fino a quando la firma fosse la stessa oi figli richiesti delle classi richieste dal genitore.

es. addMember(someClassChild $obj)

Ma l'ho provato e ricevo un avvertimento sugli standard rigorosi.

Quindi, come posso implementare una classe di raccolta come figlio di un'altra classe di raccolta per fornire funzionalità per gli oggetti di base padre / figlio?

    
posta Buttle Butkus 23.02.2015 - 07:50
fonte

2 risposte

4

È una violazione del principio di sostituzione di Liskov. Fondamentalmente ogni classe che usa SomeClass deve poter contare sul fatto che addMember accetta un SomeClass o una qualsiasi delle sue sottoclassi. Nel tuo esempio, non è più vero, perché ora hai un'implementazione di SomeClass che causerà un errore irreversibile ogni volta che viene passato un oggetto SomeClass che non è un SomeClassChild .

Alcune lingue consentono la controvarianza degli argomenti del metodo, il che significa che una sottoclasse può accettare un tipo più generale (piuttosto che più specifico come nell'esempio), il che ha senso, perché qualsiasi SomeClass è anche un SomeSuperClass se SomeClass extends SomeSuperClass . PHP tuttavia non supporta questo.

    
risposta data 24.02.2015 - 10:02
fonte
2

Il principio che stai cercando è covarianza e controvarianza in suggerimenti di tipo. Per quanto ne so, PHP non lo supporta.

    
risposta data 23.02.2015 - 08:24
fonte

Leggi altre domande sui tag