2016-04-11 43 views
7

Oggi ho avuto un colloquio per la posizione di ingegneria del software. Ho letto molte cose da StackOverflow per l'intervista. Mi hanno chiesto delle cose normali realizzate in OOP. Ma mi hanno anche chiesto:L'ereditarietà è necessaria per l'incapsulamento, l'astrazione e il polimorfismo?

L'incapsulamento è possibile senza ereditarietà?

Is Abstraction possible senza ereditarietà?

Il polimorfismo è possibile senza ereditarietà?

Ho risposto a questi secondo la mia conoscenza di OOP. Non so se sia giusto o sbagliato. Qualcuno può dirmi la risposta corretta di questi con alcuni esempi correlati.

Grazie

risposta

3
  • È incapsulamento possibile senza eredità?

Sì, perché l'incapsulamento è la capacità di nascondere le proprietà di una classe dal mondo esterno tramite i metodi di accesso.

  • L'astrazione è possibile senza ereditarietà?

Beh, astrazione può riferirsi a molte cose, ma si parla di OOP: No, una classe astratta non può essere utilizzato direttamente, è possibile creare un'istanza solo classi ereditate.

  • Il polimorfismo è possibile senza ereditarietà?

Sì, il polimorfismo è la costruzione di una singola interfaccia per diversi tipi di oggetti, ad esempio una singola chiamata di funzione che può ricevere classi o tipi di dati diversi come argomenti. Possono essere ereditati o no.

+0

Quindi, nell'incapsulamento. Stai dicendo che hai una lezione in cui hai tutti i metodi e vuoi nasconderlo al di fuori del mondo? destra? allora dov'è il tuo metodo di accesso? Se è nella stessa classe? allora non sono visibili? –

+0

Intendevo dire che vuoi nascondere le proprietà della classe o dell'istanza dal mondo esterno, quindi costruisci metodi (setter, getter, ecc.) Per evitare l'accesso diretto ad essi. Questo è incapsulamento. – manolonte

+0

La parte "etc" è essenziale. Alcune persone credono che l'incapsulamento significhi solo fornire getter e setter senza rendersi conto che si tratta in realtà di unire insieme i dati e il comportamento associato (cioè i metodi che fanno uso di tali dati). [http://www.javaworld.com/article/2075271/core-java/encapsulation-is-not-information-hiding.html](http://www.javaworld.com/article/2075271/core-java/ encapsulation-is-not-information-hiding.html) – Piovezan

2

L'incapsulamento è sicuramente possibile senza ereditarietà. L'incapsulamento è il concetto di nascondere i dati provenienti da oggetti esterni che non dovrebbero essere in grado di manipolarli. Un esempio di incapsulamento sarebbe costituito dai campi privati ​​di un oggetto in Java. È quindi possibile utilizzare metodi pubblici (come getter e setter o altri metodi di calcolo) per manipolare i dati solo se necessario.

L'astrazione e il polimorfismo, tuttavia, sono direttamente correlati all'ereditarietà.

L'astrazione è quando si tolgono i dettagli di implementazione di un oggetto e si crea una classe astratta o un'interfaccia (parlando in termini di Java). Questo fungerà da contratto per ciò che qualsiasi classe implementante o ereditante dovrà includere nell'implementazione dettagliata. La classe astratta avrà firme di metodo, ma nessun corpo; la classe ereditaria implementerà i corpi.

Il polimorfismo è la capacità di implementare qualcosa di astratto in diverse forme. Ad esempio, se hai una classe astratta chiamata Animal che contiene un metodo speak(), puoi creare una classe Dog che eredita da Animal e implementare speak() per stampare "woof", mentre una classe Cat() implementerebbe speak () per stampare "meow".

Si noti che dipende dal tipo di polimorfismo in esame.È possibile, come affermato in un'altra risposta, avere il polimorfismo del parametro metodo/funzione e, come affermato, è possibile senza ereditarietà.

0

Beh, la mia comprensione:

  • incapsulamento è solo un'idea per impedire la modifica diretta allo stato di un'istanza , si può fare anche senza OOP.

  • L'astrazione è la generalizzazione delle classi (modelli di oggetto), non è possibile eseguire senza ereditarietà. Si concentra sui termini del contratto comune.

  • Il polimorfismo indica la stessa azione ma comportamenti diversi. Di solito è funziona con l'astrazione/interfacce. Essa non può essere fatto senza programmazione orientata agli oggetti

+0

senza OOP o senza ereditarietà? –

+0

senza ereditarietà e sì, anche senza OOP. –

0
  • Encapsulation è possibile senza eredità:

    sufficiente aggiungere attributo private a una classe e utilizzare setter e getter per accedere a questo attributo.

  • Abstraction da sé è possibile senza eredità: È possibile effettuare una classe astratta e non richiede alcuna eredità.

Se la domanda posta era: può una classe astratta essere utilizzato senza eredità?

Quindi no, non può essere utilizzato senza ereditarietà perché deve essere istanziata prima e quindi richiede l'ereditarietà. Ma l'astrazione di per sé non ha bisogno di ereditarietà.

  • Polymorphism è non è possibile senza l'ereditarietà: Questo perché il polimorfismo tra i due tipi di oggetti deve avere qualcosa in comune per farlo funzionare. Questo potrebbe essere semplice anche con la classe Object in caso di java, da cui derivano tutte le classi.
+0

Dipende interamente dalla lingua. Ad esempio, in Smalltalk, è possibile ottenere il polimorfismo senza ereditarietà, perché Smalltalk è un linguaggio di associazione tardiva che consente di trattare due oggetti come uguali purché entrambi implementino gli stessi metodi (incluse le firme) –

+0

Buono a sapersi. Quindi non c'è una risposta corretta per questa domanda fino a quando non viene specificata una lingua? – Rana

1

La risposta a tutte e tre le domande è Sì, è possibile eseguirle senza ereditarietà, ma la vera risposta è "Dipende dal linguaggio in cui sono implementate".

Voglio dire, considerare che il primissimo compilatore C++ ha effettivamente compilato il suo codice allo standard C, che non è un linguaggio OOP. Ovviamente, il codice doveva essere compilato in un linguaggio che non supportava l'ereditarietà.

0

Direi

Incapsulamento - sì. Ad esempio una funzione che manipola una variabile statica dichiarata al suo interno (come in C++). Oppure codice c che nasconde variabili e funzioni non esportate da altre unità di compilazione.

Astrazione - sì. "Concetti" in C++ ne sono un esempio.In C++ puoi scrivere una routine e dire "questo codice viene compilato fintanto che il tipo di argomento definisce un operatore inferiore a".

Polimorfismo - sì. Un puntatore a funzione semplice può essere utilizzato per fornire un'implementazione collegabile.