Si us preguntem en una entrevista de codificació, "quina és la diferència principal entre una interfície i una classe abstracta", quina és la resposta correcta?


Resposta 1:

Home viu, jo els he emportat a la meitat.

Realment no "sé la resposta", però sé quina és la meva opinió.

Jo faig servir interfícies com a promesa per trucar el codi que pot esperar. És l’abstracció: el que sempre és cert, sigui quina sigui la seva implementació. Per a mi, representa (normalment) el domini d'aplicació: el tema.

El meu darrer exemple és

interfície UserProfiles {
  Carrega opcional  (número de compte UUID);
}

El codi de trucada subministra un identificador de compte i es recupera un perfil, si està disponible.

Actualment té un parell d’implementacions mentre transitem un sistema. Una classe abstracta pot ser útil aquí.

Una classe abstracta representa per a mi un "mecanisme personalitzable". No forma part del tema. Un client no hauria de confiar en ell com a promesa dels serveis prestats.

Forma part de la implementació. Concretament, és el codi d'implementació comú que es comparteix entre dues o més implementacions possibles d'una interfície.

Podríem tenir una classe abstracta

abstract class DatabaseUserProfiles implementa UserProfiles {
  Càrrega opcional  (nombre UUID del compte) {
    String databaseSpecificSql = getQueryFindByAccountNumber (compteNumber);

    return executeQuery (databaseSpecificSql);
  }

  abstract String getQueryFindByAccountNumber (nombre UUID del compte);
}

En aquest exemple fictici, tindríem un parell de productes de base de dades SQL que suportàvem per emmagatzemar perfils i utilitzaríem un «mètode de plantilla» GoFueryFindByAccountNumber () per retornar la base de dades SQL específica.

Les parts compartides d'utilitzar una base de dades SQL genèrica es trobarien en un altre lloc d'aquesta classe abstracta.

Per tant, sí, realment tindria una interfície (promesa de l'assumpte / client) i una implementació compartida d'un ABC (de vegades).

Dues finalitats diferents per a la llegibilitat.

I sí, des del Java 8/9/10 que sigui, aquesta línia és tan desdibuixada com mai a C ++ Si bé podeu utilitzar un ABC per servir els dos propòsits, no vull, perquè no transmet al lector del meu codificar el que vull que digui.

Arribats a aquest punt, tots sembla una mica avorrits i passem a una mica de pissarra, espero.


Resposta 2:

Suposo que diria que la interfície admet herències múltiples i la classe abstracta no. La segona diferència és que tots els mètodes de la interfície han de ser abstractes.

La interfície és realment més abstracta que la mateixa classe abstracta. Si ho necessiteu, fins i tot podríeu crear una interfície que estengui moltes altres interfícies.

La interfície és la classe abstracta final. La classe abstracte és un híbrid entre la interfície i la classe concreta.

Una classe abstracta pot contenir mètodes concrets i, per tant, l'herència múltiple pot crear anul·lacions ambigües de mètodes concrets, cosa que no és el cas per a les anàlisis de mètodes abstractes perquè els mètodes abstractes són buits, si això té sentit, i per tant Java permet només herència múltiple per a interfícies.

Si observeu la jerarquia de les col·leccions Java, veureu com les interfícies fan que el gràfic sigui acíclic com un arbre Git en lloc de binari, com seria el cas si no s'utilitzessin les interfícies.


Resposta 3:

Suposo que diria que la interfície admet herències múltiples i la classe abstracta no. La segona diferència és que tots els mètodes de la interfície han de ser abstractes.

La interfície és realment més abstracta que la mateixa classe abstracta. Si ho necessiteu, fins i tot podríeu crear una interfície que estengui moltes altres interfícies.

La interfície és la classe abstracta final. La classe abstracte és un híbrid entre la interfície i la classe concreta.

Una classe abstracta pot contenir mètodes concrets i, per tant, l'herència múltiple pot crear anul·lacions ambigües de mètodes concrets, cosa que no és el cas per a les anàlisis de mètodes abstractes perquè els mètodes abstractes són buits, si això té sentit, i per tant Java permet només herència múltiple per a interfícies.

Si observeu la jerarquia de les col·leccions Java, veureu com les interfícies fan que el gràfic sigui acíclic com un arbre Git en lloc de binari, com seria el cas si no s'utilitzessin les interfícies.


Resposta 4:

Suposo que diria que la interfície admet herències múltiples i la classe abstracta no. La segona diferència és que tots els mètodes de la interfície han de ser abstractes.

La interfície és realment més abstracta que la mateixa classe abstracta. Si ho necessiteu, fins i tot podríeu crear una interfície que estengui moltes altres interfícies.

La interfície és la classe abstracta final. La classe abstracte és un híbrid entre la interfície i la classe concreta.

Una classe abstracta pot contenir mètodes concrets i, per tant, l'herència múltiple pot crear anul·lacions ambigües de mètodes concrets, cosa que no és el cas per a les anàlisis de mètodes abstractes perquè els mètodes abstractes són buits, si això té sentit, i per tant Java permet només herència múltiple per a interfícies.

Si observeu la jerarquia de les col·leccions Java, veureu com les interfícies fan que el gràfic sigui acíclic com un arbre Git en lloc de binari, com seria el cas si no s'utilitzessin les interfícies.