Ereditarietà di classe: dovrebbero essere compatibili i costruttori?Caso di più ereditarietà?[duplicare]

StackOverflow https://stackoverflow.com/questions/8975202

Domanda

Questa domanda ha già una risposta qui:

    .
  • . I costruttori devono essere conformi al principio di sostituzione di Liskov? [chiuso] 3 risposte

    uno dei Principi consigliati della programmazione orientata agli oggetti è il Principio di sostituzione di Liskov : una sottoclasse dovrebbe comportarsi allo stesso modo della classe base (ES) (AVVERTENZA : In realtà non è una descrizione corretta del principio di Liskov: vedere il PS).

    Si raccomanda di applicare anche a costruttori ? Prevalentemente ho in mente Python e i suoi metodi __init__(), ma questa domanda si applica a qualsiasi linguaggio orientato all'oggetto con l'ereditarietà.

    Sto facendo questa domanda perché a volte è utile avere una sottoclasse eredita da una o più classi che forniscono un comportamento predefinito bello (come ereditando da un dizionario, in Python, in modo che obj['key'] funzioni per oggetti della nuova classe) . Tuttavia, non è sempre naturale o semplice permettere che la sottoclasse venga utilizzata esattamente come un dizionario: A volte sarebbe più bello che i parametri del costruttore si riferiscano solo alla sottoclasse specifica dell'utente (ad esempio, una classe che rappresenta una serie di porte seriali Potrebbe voler comportarsi come un dizionario con ports['usb1'] essere porto USB # 1, ecc.). Qual è l'approccio raccomandato a una tale situazione? Avere costruttori di sottoclasse che sono pienamente compatibili con quelli delle loro classi di base e generando casi attraverso una funzione di fabbrica oggetto che richiede parametri semplici e user-friendly? o semplicemente scrivere un costruttore di classe il cui set di parametri non può essere dato direttamente al costruttore delle sue classi di base, ma che è più logico dalla prospettiva dell'utente?

    PS : Ho erroneamente interpretato il principio di Liskov, sopra: il commento di Sven sottolinea il fatto che oggetti di una sottoclasse dovrebbe comportarsi come oggetti della superclasse (la sottoclassione stessa non deve comportarsi come la superclasse; in particolare, i loro costruttori non devono avere gli stessi parametri [Firma]).

È stato utile?

Soluzione

Come richiesto, postsi come risposta ciò che in precedenza è stato un commento.

Il principio come definito nell'articolo di Wikipedia collegato si legge "Se S è un sottotipo di T, quindi gli oggetti di tipo T possono essere sostituiti con oggetti di tipo S". Non legge "Una sottoclasse dovrebbe comportarsi allo stesso modo della sua classe base (ES)". La differenza è importante quando si riflette sui costruttori: la versione Wikipedia parla solo di oggetti di un sottotipo, non il tipo stesso. Per un oggetto, il costruttore è già stato chiamato, quindi il principio non si applica ai costruttori. Questo è anche come lo applicalo e i modi che sembra applicati nella libertà standard (E.G defaultdict e dict).

Costruttori in più ereditarietà probabilmente non possono essere discussi in modo linguistico-agnostico. In Python, ci sono due approcci. Se il diagramma di eredità include i modelli di diamante e devi assicurarti che tutti i costruttori siano chiamati esattamente una volta, è necessario utilizzare super() e seguire il modello descritto nella sezione "Consigli pratici" dell'articolo di Raymond Hettinger super() di Python considerato Super . Se non si dispongono di diamanti (ad eccezione di quelli che includono object), è anche possibile utilizzare chiamate di classe base esplicita per tutti i costruttori di classe base.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top