Posso considerare i metodi di interfaccia come metodi astratti?


15

Ci stavo pensando e avevo dei dubbi.

Quando dichiaro un'interfaccia, ad esempio:

public interface MyInterface
{
   public void method1();
   public void method2();
}

Questi metodi di interfaccia potrebbero essere considerati astratti? Quello che voglio dire è che il concetto di un metodo astratto è:

Un metodo astratto è un metodo dichiarato, ma non contiene implementazione.

Quindi, questi metodi potrebbero essere considerati astratti? Non sono metodi astratti "puri" in quanto non sto usando la abstractparola, ma concettualmente sembra che lo siano.

Cosa puoi dirmi a riguardo?

Grazie.


Probabilmente il migliore su SO
billy.bob il

5
@ billy.bob - Penso che sia troppo astratto per Stack Overflow. Non c'è un problema di codifica specifico qui.
ChrisF

Questo codice è Java?
Andres F.

no non lo è. è solo un esempio. la domanda non è focalizzata su nessun linguaggio di programmazione.
rogcg

Risposte:


14

Un'interfaccia è come una classe "puramente" astratta. La classe e tutti i suoi metodi sono astratti. Una classe astratta può avere metodi implementati ma la classe stessa non può essere istanziata (utile per l'ereditarietà e seguendo DRY).

Per un'interfaccia, poiché non esiste alcuna implementazione, sono utili per il loro scopo: un contratto. Se si implementa l'interfaccia, è necessario  implementare i metodi nell'interfaccia.

Quindi la differenza è che una classe astratta può avere metodi implementati mentre un'interfaccia non può.

Il motivo per cui sono separati è quindi una classe in grado di implementare diverse interfacce. Java e C # limitano una classe inerente a una singola classe genitore. Alcune lingue ti consentono di ereditare da più classi e potresti svolgere il lavoro di un'interfaccia tramite una classe "puramente" astratta. Ma l'eredità multipla ha i suoi problemi, vale a dire il temuto Diamond Problem


+1 per incorporare la differenza tra eredità di una classe astratta e implementazione di una o più interfacce.

Diamond Problem è un paradosso fantastico.
rogcg,

1
Non sono d'accordo con "Un'interfaccia è come una parte di" classe puramente astratta ". Sono 2 diversi tipi di 'blocchi' OO, quindi non sono affatto simili. Condividono alcune caratteristiche comuni, ma in natura sono tipi diversi, più simili agli uomini e alle donne per esempio :)
NoChance,

5
@Emmand Kareem Non sono in disaccordo con "Un'interfaccia è come una parte di classe" puramente "astratta". Ecco perché l'ho scritto :-). Se hai delle buone ragioni per il tuo disaccordo, per favore pubblica un post, id like to hear
coder

Vale la pena notare che c # 8 introduce anche il concetto di implementazione di un'interfaccia predefinita
John Wu

11

Ho trovato una risposta utile qui: http://download.oracle.com/javase/tutorial/java/IandI/abstract.html

Tutti i metodi in un'interfaccia sono implicitamente astratti, quindi il modificatore astratto non viene utilizzato con i metodi dell'interfaccia (potrebbe essere - semplicemente non è necessario).


1
Si noti inoltre che una classe astratta estende un altro oggetto. Le interfacce non hanno la nozione di una superclasse.

2
Inoltre, puoi implementare più interfacce, ma puoi ereditare solo da una classe, astratta o no.
NullUserException

@ ThorbjørnRavnAndersen: un'interfaccia può estendere una o più interfacce. Non è la stessa cosa di una super classe, ma è un livello di eredità.
unholysampler,

È possibile implementare più interfacce. Sembra il concetto di eredità multipla, ma non esattamente.
rogcg,

@unholysampler, che non è una superclasse - come ho detto.

4

Le classi astratte possono avere metodi astratti.

Le interfacce possono avere solo metodi astratti.

method1()e method2()nel tuo esempio sono metodi astratti.


-1

La differenza qui è che le classi astratte possono contenere dettagli di implementazione, sebbene non possano essere istanziate da sole. Considerando che un'interfaccia è semplicemente un modello per una classe


8
I metodi astratti non possono contenere dettagli di implementazione. Le lezioni astratte possono.
Matt H

Conosco la differenza tra un metodo e una classe, ma non riesco a capire il punto che stai facendo?
billy.bob,

La tua risposta afferma che i metodi astratti possono contenere dettagli di implementazione - non possono. Solo un errore di battitura?
Matt H

1
Ho corretto l'errore di battitura.
Martijn Verburg,

1
@ billy.bob questa domanda riguarda il metodo abstact.
SoylentGray,

-2

Quindi in una sottoclasse, il metodo astratto ereditato può di nuovo diventare astratto senza implementazione, mentre se una classe implementa un'interfaccia è necessario implementare il metodo.


-3

Le classi di interfaccia non hanno metodi astratti. Non hanno alcun metodo. Hanno solo un elenco di metodi che un'altra classe dovrebbe implementare per essere in grado di conformarsi all'interfaccia. Nel tuo esempio, non esiste alcun metodo method1 e nessun method2 finché qualcuno non aggiunge questi metodi a una classe.

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.