L'Orientamento degli oggetti richiede il concetto di ereditarietà? [chiuso]

4

Ho letto Analisi orientata agli oggetti e progettazione con le note delle applicazioni scritto da Grady Booch. Nel libro c'è una frase:

There are three important parts to this definition: (1) Object-oriented programming uses objects, not algorithms, as its fundamental logical building blocks (the “part of” hierarchy we introduced in Chapter 1); (2) each object is an instance of some class; and (3) classes may be related to one another via inheritance relationships (the “is a” hierarchy we spoke of in Chapter 1). A program may appear to be object-oriented, but if any of these elements is missing, it is not an object-oriented program. Specifically, programming without inheritance is distinctly not objectoriented; that would merely be programming with abstract data types.

Voglio sapere che è giusto? Se non abbiamo ereditarietà "il nostro programma non è orientato agli oggetti?

    
posta Shahrooz Jafari 20.01.2015 - 20:03
fonte

4 risposte

10

If we don't have inheritance our program is not object oriented?

Umm, no.

Prevedo che la maggior parte dei programmatori considererebbe comunque un programma con oggetti tradizionali (bundle di stati e funzioni correlati) come orientato agli oggetti, anche se non esiste un'eredità. Negli ultimi anni, è diventato ampiamente accettato che l'eredità di oggetti concreti è qualcosa da usare con cautela se non evitata a titolo definitivo.

Indipendentemente, stai chiedendo della terminologia. Non ci sono regole per ciò che orientato agli oggetti è veramente. È un nome usato liberamente per aiutare a comunicare concetti; concetti che sono sempre meno utili nell'aiutare i programmatori a risolvere i problemi.

    
risposta data 20.01.2015 - 20:11
fonte
6

Alan Kay, che ha coniato la frase programmazione orientata agli oggetti ha rilevato qui e in altri luoghi, orientato agli oggetti la programmazione riguarda più i messaggi che gli oggetti. La chiave è che i programmi sono progettati come un insieme di oggetti che comunicano attraverso i messaggi (in molte lingue un messaggio viene definito come una chiamata al metodo polimorfico).

In Smalltalk (il linguaggio su cui Alan Kay stava lavorando) quando un messaggio viene inviato a un oggetto, il destinatario dell'oggetto determina come l'oggetto risponderà. In un linguaggio basato su classi, il comportamento tipico è:

  1. Controlla se l'oggetto ha un metodo che corrisponda alla firma del messaggio, in tal caso invocalo.
  2. Altrimenti, selezionare (in modo ricorsivo) se una delle classi base dell'oggetto contiene un metodo che corrisponde alla firma del metodo. Quando una classe eredita un'altra classe, significa che i metodi della classe base sono disponibili per gli oggetti della classe derivata, ma possono essere sovrascritti per fornire un comportamento diverso.

Tuttavia, altri linguaggi come Self e JavaScript, oggetti non sono istanze di classi. Al posto dell'ereditarietà, viene utilizzato un modello noto come delega. Quando un oggetto riceve un messaggio che non capisce, può delegare la sua risposta a un altro oggetto noto come prototipo.

In tutte le lingue menzionate finora, a differenza della maggior parte dei linguaggi tradizionali come Java, C ++ e C #, qualsiasi oggetto può implementare un messaggio per qualsiasi messaggio. C ++ ha derivato un modello diverso (e più restrittivo) da Simula, in cui un messaggio è definito su una classe base e può essere sovrascritto da una classe derivata, ma nessun'altra classe può rispondere al metodo.

Auto dimostrato, includendo in immagini un sottosistema Smalltalk, che usando il modello basato su prototipo un modello basato su classi può essere implementato come un modello di programmazione, quindi in questo senso il modello basato su prototipo è più descrittivo. L'inverso richiederebbe l'implementazione di un nuovo sistema di oggetti da zero (ad esempio una classe chiamata PrototypicalObject, con un comportamento completamente diverso dai normali oggetti Smalltalk).

Al centro, OOP riguarda oggetti e messaggi (chiamate ai metodi), in cui vari oggetti possono implementare risposte diverse allo stesso messaggio. I dettagli dell'ereditarietà e delega possono aiutare a creare quegli oggetti, ma sono semplicemente varianti del modello standard.

    
risposta data 20.01.2015 - 22:05
fonte
2

La maggior parte dei principi OO dipende dall'ereditarietà, dall'astrazione e dalle interfacce. Quindi l'ereditarietà e l'implementazione dell'interfaccia giocano un ruolo importante nella progettazione di software orientato agli oggetti.

Potresti leggere su SOLID e altri principi di progettazione orientata agli oggetti.

Naturalmente è possibile scrivere programmi in linguaggi orientati agli oggetti senza utilizzare l'ereditarietà (e in particolare le interfacce e le specializzazioni di tali interfacce) ma si finirà con un codice più strettamente accoppiato.

    
risposta data 20.01.2015 - 20:17
fonte
1

L'ereditarietà è un'altra forma di contenimento anche se l'ereditarietà è l'implementazione dell'interfaccia. Senza sfruttare l'ereditarietà, si perde molta della forza della programmazione orientata agli oggetti.

L'ereditarietà consente di sostituire le implementazioni di una classe senza influire sul client della classe. Pensa a un framework UI (come MFC o WPF). Gran parte del framework dipende dal fatto che un Button, TextBox, Label e Combobox sono tutte sottoclassi dello stesso controllo della classe base. Se non ci fosse questa interfaccia o classe base comune, ci sarebbe un'enorme proliferazione di codice per fare la stessa cosa per le specifiche istanze di queste classi.

In questo caso potresti anche usare C di base.

    
risposta data 20.01.2015 - 20:20
fonte

Leggi altre domande sui tag