2011-12-16 19 views
23

Sto leggendo il libro The Java Programming Language. Nel capitolo che spiega prioritario metodo, si dice:Cosa significa "contratto" di una classe significa

Fare una metodo di sostituzione (in sottoclasse) meno accessibile di quanto non fosse in classe Super violerebbe il contratto della superclasse ...

Il testo nel suo complesso è comprensibile. La mia unica domanda è qual è il contratto della superclasse? Che cosa significa il contratto per una classe Java Java?

+0

Vedere ** design per contratto ** [su Wikipedia] (https://en.wikipedia.org/wiki/Design_by_contract) e [su c2.com] (http://wiki.c2.com/?DesignByContract). –

risposta

28

Un contratto in una classe Java è simile a un contratto nel mondo reale - in termini non tecnici:

E 'un accordo che la classe esporrà alcuni metodi, certe proprietà, e certi comportamenti.

Più tecnico, da here: (grassetto aggiunto da me)

Non sarebbe bello se tutte le classi Java che si utilizza, tra cui il vostro proprio, vissuto fino alle loro promesse? In effetti, non sarebbe bello se tu sapessi esattamente che cosa promette una determinata classe? Se siete d'accordo, leggere su [...]

Design by Contract

Il Design by Contract tecnica (DBC) lo sviluppo del software garantisce software di alta qualità, garantendo che ogni componente di un sistema all'altezza alle sue aspettative. Come sviluppatore che utilizza DBC, si specificano i contratti del componente come parte dell'interfaccia del componente. Il contratto specifica ciò che il componente si aspetta dai client e quali client possono aspettarsi da .

+1

C'è una differenza tra un contratto e le specifiche? Sembra che il contratto sia solo un termine umanizzato per le specifiche, poiché le persone accettano i contratti, ma le macchine e i processi sono costruiti secondo le specifiche. (Almeno, nella mia interpretazione della lingua inglese.) – Buttons840

+4

"Specifica" può essere intesa come il dettaglio dell'attuazione, cioè i metodi e le proprietà protetti e privati. "Contratto" significa in realtà solo i metodi e le proprietà pubbliche. – dgvid

+0

Penso che sia così: su un progetto software, in cui si assume un fornitore, c'è un contratto per il lavoro da svolgere (di solito piuttosto generale) e (si spera) un documento dei requisiti specifici che è più dettagliato. La specifica è più simile al documento dei requisiti, in quanto implementa il contratto, con specifiche su come è stato fatto. – David

2

Significa che il metodo che esegue l'override di un metodo su una classe o un'interfaccia genitore deve comportarsi nel modo definito dal contratto.

In caso contrario, il risultato non è definito.

3

Il "Contratto" di una classe è un'interfaccia pubblica o almeno l'interfaccia se presenta classi diverse da se stessa.

Ciò significa che include qualsiasi elemento (metodi, campi, costruttori, ecc.) Che può utilizzare altre classi.

0

Vi sono molti principi ai quali è necessario conformarsi durante la programmazione in Java o in qualsiasi linguaggio di programmazione. I principi dipendono dal linguaggio di programmazione che si sta utilizzando. Si può sapere di più su contratto in Design by contract wikipedia page

0

in termini semplici vuol dire che ci si rompere le condizioni di superclasse se u rendere il codice di override meno accessibile

4

contratto di tipo (classe, interfaccia, enum) è la, beh, il contratto questo tipo promette di rispettare.Si afferma:

  • quali sono i parametri accettabili per il costruttore e/oi metodi di questo tipo;
  • cosa dovresti e/o non dovresti aspettarti da questo tipo. Ad esempio, si può affermare che ci si aspetta che questa classe sia sicura per i thread o non thread-safe;
  • quali sono gli invarianti supportati da questo tipo. Ad esempio, digitare il metodo addData(float) della classe MathAverage che calcola la media del suo input può indicare che ogni volta che viene restituita la chiamata a add(float), è necessario chiamare il numero MathAverage.getAverage() per restituire la media corretta dell'ingresso corrente.
  • in generale, il tuo tipo può specificare qualsiasi vincolo che deve seguire tutti i sottotipi. Ad esempio, potrebbe dire "nessun metodo di questo tipo deve impiegare più di 1 secondo per essere eseguito".

Il contratto è specificato in forma libera in javadoc di tipo. Esistono alcuni strumenti/pratiche per far rispettare l'esecuzione dei contratti, ma sono limitati, esattamente perché il contratto può essere arbitrario o, addirittura, auto-contraddittorio, in caso di errore del programmatore.

Poiché la sottotipizzazione (sottoclasse) può estendere/modificare il comportamento dei metodi supertipo in modo arbitrario, può anche violare alcune parti del contratto del supertipo. Esempio di questo sarebbe l'estensione HashMap, che accetta valori e chiavi null, con qualche implementazione che proibisce i valori null nelle chiamate ai suoi metodi.

Altro aspetto importante su contratto tipo è che sottotipo può avere forte contratto (che copre sottoinsieme di vincoli nel contratto di tipo), ma non può avere più debole contratto (che copre superset di vincoli nel contratto di tipo). Ad esempio, se il metodo del tipo 'doX (n)' promette di assumere l'ora O(n) (lineare), 'doX (n)' nel sottotipo può richiedere O(1) (costante) ora, ma non può prendere il tempo O(n^2).

0

È un'espressione che deriva dall'idea di contratti nel "mondo reale".

In pratica, se si interrompe il contratto con una classe, non è necessario comportarsi come ci si potrebbe aspettare. Dall'altra direzione, è una promessa da parte della classe che se si seguono le regole stabilite, si comporterà come dice la sua API.

Un esempio comune di contratto in Java è l'override di equals() quando viene sostituito il numero hashCode(). Due oggetti considerati uguali devono, per contratto, avere lo stesso codice hash. È possibile scrivere codice sintatticamente corretto che non obbedisce a questo, ma potrebbe non funzionare correttamente, ed è colpa del programmatore che ha rotto il contratto.

0

Il contratto di una classe o di un'interfaccia, in Java o in qualsiasi altra lingua OO, si riferisce generalmente ai metodi (o funzioni) esposti pubblicamente e alle proprietà (o campi o attributi) dell'interfaccia di classe insieme a eventuali commenti o documentazione che si applica a quei metodi e proprietà pubblici.

Nel caso della relazione tra una classe e una sottoclasse, tutti i metodi o proprietà protetti verranno considerati "esposti pubblicamente", nel senso che sono esposti alla sottoclasse.