Quando implementare ed estendere? [chiuso]


91
  • Quando dovrebbe implemento extendessere usato?
  • Quali sono alcuni esempi del mondo reale?

È corretto?

L'implementazione sembra essere un modo per imporre che determinati metodi esistano in una classe e che le chiamate alle funzioni di questi metodi siano formattate correttamente. L'implementazione non è un modo per passare variabili o "impostazioni" alla classe però?

Scenario di vita reale previsto: ho una piattaforma di e-commerce con più classi di pagamento che seguono tutte lo stesso design. Quando è necessario aggiungere una nuova classe di pagamento, è davvero facile seguire il design definito del interfaceper garantire che tutti i pezzi siano presenti, dall'inizio.

L'estensione delle classi fa sì che la classe estesa (figlia?) Erediti tutto dalla sua classe genitore eccetto metodi e variabili dichiarati come private?

Scenario di vita reale previsto: ho una classe chiamata sessionscon due classi figlie denominate sessioncookiese databasesessions. sessioncookiese databasesessions, insieme, ereditano una serie di opzioni di configurazione reciproca dalle loro sessioni padre, rendendo facile modificare un'opzione di configurazione per influenzare tutti i tipi di eventuale memorizzazione dei dati dei visitatori.


1
Ti consiglio di documentarti sull'eredità.
Rafe Kettler

Risposte:


64

L'ereditarietà è utile per ridurre la quantità di codice riscritto. Se hai diverse classi con pochi metodi o campi comuni, invece di definire questi metodi e campi più e più volte puoi scomporli in una classe base e fare in modo che ciascuna delle classi figlie estenda quella classe base.

Le interfacce (e implements) sono utili quando si desidera definire un protocollo comune per il comportamento di un gruppo di oggetti. Ad esempio, potresti voler imporre che gli oggetti che sono comparabili possano essere confrontati per uguaglianza e hash, ecc.

L'uso dell'ereditarietà è in definitiva una scelta progettuale. Stai alla ricerca di casi in cui definisci gli stessi metodi in diverse classi; quelli sono casi eccellenti in cui puoi scomporre questi metodi in una classe base. Lo stesso vale per le classi che osservano alcune delle stesse caratteristiche: puoi garantire la coerenza inserendo quelle caratteristiche in un'interfaccia che deve essere implementata da quelle classi correlate.

L'ereditarietà è un concetto importante in OOP che va ben oltre il semplice PHP. Ti consiglio di leggere l'articolo di wikipedia sull'eredità e forse Design Patterns della Gang of Four .

Credo che la tua comprensione dell'eredità sia principalmente corretta. Il prossimo passo sarebbe usarlo in produzione.


4
Molte persone ora considerano il libro The Gang of Four troppo pesante in termini di materiale come un'introduzione ai modelli di design. Un'alternativa popolare è Head First: Design Patterns che rende la lettura più leggera. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"Stai attento ai casi in cui definisci gli stessi metodi in più classi; quelli sono casi eccellenti in cui puoi scomporre questi metodi in una classe base." L'estensione di una classe avrebbe un vantaggio rispetto all'utilizzo di un tratto per definire quei metodi?
Daniel Weiner

1
"L'ereditarietà è utile per ridurre la quantità di codice che si riscrive" - ​​Lo scopo dell'ereditarietà è condividere il comportamento, non il codice. Ove possibile, i tratti sono il modo per condividere il codice piuttosto che estendere una classe astratta con classi concrete che altrimenti non hanno nulla in comune. Di solito puoi modellare le tue classi come relazioni has-a piuttosto che is-a, il che faciliterà ulteriormente sia la riusabilità del codice che il polimorfismo.
Duncan

14

Strumento:

Le interfacce sono classi astratte, quindi puoi solo dichiarare cose. Una classe implementa un'interfaccia. Puoi implementare più interfacce.

Estendere:

È estendere le classi quando si desidera una versione più specifica di una classe.

Esempio:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Sia Camel che Dog sono animali, quindi estendono la Animalclasse. Ma solo il cane è un tipo specifico di Animalche anche può essere unPet

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.