devo estendere o creare un'istanza della classe

2

Ho due classi, Classe A e Classe B

In Classe A, ho tre metodi che eseguono il salvataggio, l'eliminazione e la selezione dell'operazione in base all'oggetto che li passo. In Classe B eseguo le operazioni logiche, come la modifica della proprietà dell'oggetto prima di passare ai metodi della Classe A.

Il mio problema è nella classe B, dovrebbe estendere la classe A e chiamare i metodi della classe A, da parent :: methodName o creare l'istanza della classe A e quindi chiamare

La classe A non include i soli metodi di proprietà.

class A{
  public function save($obj){
         //code here
    }

   public function delete($obj){
         //code here
    }

    public function select($obj){
         //code here
    }
 }

// Devo estendere la classe A e chiamare il metodo per parent: methodName ($ obj)    oppure crea un'istanza di classe A, chiama il metodo $ instanceOfA- > methodName ($ obj);

 class B extends A{

    public function checkIfHasSaved($obj){
         if($obj->saved == 'Yes'){
                  parent::save($obj);   //**should I call the method like this**
                 $instanceOFA = new A();   //**or create instance of class A and call without extending class A** 
                 instanceOFA->save($obj);
            }
             //other logic operations here
      }

 }
    
posta meWantToLearn 26.11.2012 - 11:19
fonte

3 risposte

3

Gli esempi forniti da te potrebbero avere nomi di classi significativi, questo favorirebbe risposte molto migliori.

Poiché la classe A non ha alcuna proprietà , è sicuro utilizzare i metodi dell'istanza che hai già:

class B extends A
{
    public function checkIfHasSaved($obj)
    {
        if($obj->saved)
            $this->save($obj);
    }
}

Un'altra alternativa sarebbe quella di utilizzare Iniezione di dipendenza invece:

class B
{
    protected $a;

    public function __construct(A $theObject)
    {
        $this->a = $theObject;
    }

    public function checkIfHasSaved($obj)
    {
        if($obj->saved)
            $this->a->save($obj);
    }
}
    
risposta data 26.11.2012 - 12:35
fonte
2

Senza conoscere i nomi e gli scopi delle classi reali è difficile dirlo. La decisione dipende dal fatto che la classe B sia realmente un tipo di classe A o che la classe B abbia solo bisogno di qualche classe di servizio A. Ad esempio, molti programmatori commettono l'errore di costruire classi di modelli estendendo una classe di livello di accesso al database sulla base del fatto che devono accedere al database per mantenere il loro stato. Questo è quasi sempre un errore. Una classe modello ha bisogno di una connessione al database ma quasi certamente non è un tipo di connessione al database.

Si riduce a stabilire se il collegamento tra le classi A e B è una relazione-is o una relazione has-a. Nel primo caso ha senso pensare alla classe B come a una classe A, e se è impossibile per la classe B guadagnare o perdere il comportamento della classe A durante la sua vita, allora una relazione is-a (sottoclasse) ha un senso. Se il comportamento della classe A è qualcosa di cui la classe B ha bisogno solo in alcune circostanze, o se non ha senso pensare alla classe B in termini di essere una specie di classe A, allora la composizione (ha una relazione) è tanto più approccio ragionevole

Dì che stai modellando una scuola e hai lezioni di Persona, Studente e Insegnante. A prima vista potresti pensare che Studente e Insegnante siano tipi di Persone, e quindi Studente e Insegnante dovrebbero estendere la Persona. Ma cosa succede se un determinato studente ottiene un lavoro a scuola come insegnante dopo la laurea? Studente e Insegnante sono in realtà ruoli che una persona può assumere, possono anche scartare quei ruoli al momento giusto. In alcuni sistemi la stessa persona potrebbe tenere più di un ruolo contemporaneamente (supponiamo che un medico venga investito da un'auto quando va a lavorare in un ospedale, potrebbe finire come paziente in quell'ospedale!)

D'altra parte, se hai una classe Car, una classe Ferrari e una classe Bugatti, allora è logico che Bugatti e Ferrari siano sottoclasse da Car. Il motivo è che Ferraris e Bugatti sono entrambi i tipi di auto, e una Ferrari sarà sempre una Ferrari dal momento in cui lascia la fabbrica al momento in cui viene demolita. Non c'è alcuna circostanza in base alla quale una Ferrari diventerà una Bugatti.

Quindi, in pratica, TL: DR, dipende.

    
risposta data 28.11.2012 - 11:22
fonte
1

Poiché è semanticamente corretto chiedere all'oggetto se è stato salvato, suppongo che sarebbe giusto chiederlo di salvare. Se estendi il salvataggio, sarà un metodo pubblico sul tuo oggetto e disponibile dall'esterno.

Dovrai decidere se è OK o meno.

    
risposta data 26.11.2012 - 11:21
fonte

Leggi altre domande sui tag