Domanda

Ecco un esempio utilizzando l'ereditarietà multipla interfaccia in Java e c'è un problema.

Si noti che ho pienamente so perché c'è un problema e questo non è il punto della mia domanda. La domanda è su come lo chiamate questo particolare multipla ambiguità interfaccia eredità, se c'è un nome per questo.

Ad esempio, in C ++, l'ambiguità che si verifica quando si utilizzano più ereditarietà dell'implementazione e non può determinare quale metodo utilizzare override è chiamata "problema diamante":

http://en.wikipedia.org/wiki/Diamond_problem

Ora, ancora una volta, so che questo non è lo stesso problema qui: non è questo il punto. Il punto è che un nome è stato coniato in quel caso precedente.

E mi piacerebbe sapere se esiste un nome per il problema che sto per descrivere.

Ecco un esempio di un altro tipo di ereditarietà multipla, dove un'interfaccia eredita da altre due interfacce che hanno un incompatibile tipo di ritorno del metodo:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

(notare l'ereditarietà multipla interfaccia sul posto di lavoro utilizzando il 'estende' parola chiave)

Non puoi farlo, perché:

  

tipi A e B sono incompatibili; entrambi   definire c (), ma con ritorno correlato   Tipo

ha un nome stato coniato per descrivere quella situazione?

È stato utile?

Soluzione

Non sono sicuro che ci sia un nome specifico per esso, o almeno non sembra essere molto comunemente usata. E ' "solo" un problema della mappatura implicita dei metodi di interfaccia a metodi di classe; se si potrebbe avere sovraccarichi che si differenziano solo i tipi di ritorno, non ci sarebbe alcun problema. Quindi si tratta di un / sovraccarico / implicita problema metodo di mappatura di firma.

Nel "Thinking in Java" Prenota online, non c'è un nome per esso sia. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001. htm

Basta un side-nota, C # consente implementazioni di interfacce esplicite, che risolve questo problema.

Altri suggerimenti

JLS §6.4. 4, i membri di un tipo di interfaccia chiama tali membri superinterfaccia duplicati ambigua , e richiede un errore di compilazione. Speravo in qualcosa di colorato come il Beaujolais Effetto , heisenbug , et al . Forse two's-a-folla

Anche io non conosco alcun nome specifico per questo problema. Ogni volta che arised è stato descritto in una frase che contiene le parole tipo restituito incompatibilità a un certo punto. Si potrebbe anche chiamare il Mappa / Set incompatibilità come questo è uno degli esempi più importanti e fastidiosi nelle librerie di classi Java. Lo rende impossibile avere la stessa classe di implementare Map così come insieme o una collezione solo perché Mappa definisce remove (Object) metodo con un diverso tipo di ritorno di raccolta.

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

Mi piacerebbe esitato a chiamare questo un problema di ereditarietà multipla, perché le interfacce semplicemente descrivere bene, l'interfaccia - un insieme di metodi di una classe che implementa deve definire - piuttosto che qualsiasi implementazione. Estendentesi un'interfaccia con altre interfacce realtà non significa i eredita sottointerfaccia dal superinterfaccia, ma piuttosto che la sottointerfaccia è, essenzialmente, una concatenazione dei metodi definiti in due.

Se una terza interfaccia viene utilizzato per estendere l'subinterface e fornisce una dichiarazione di metodo in conflitto, è essenzialmente lo stesso come se si fosse appena fornito gli stessi due metodi contrastanti nella stessa interfaccia.

Non mi ricordo se ho mai visto qualsiasi nome per questo. In linguaggio Java specifiche non c'è un nome per questa operazione.

Il problema che si descrive esiste in .NET così come Java, ma ha una soluzione semplice c'è: il framework .NET consente una classe per implementare un membro di interfaccia con un membro della classe con un nome diverso. Così, anche se i metodi della classe che implementano due organi di interfaccia che si differenziano solo tipo di ritorno devono avere nomi diversi, ciò non impedisce loro capacità di attuare organi di interfaccia con lo stesso nome.

Se un'interfaccia eredita due interfacce con i membri conflitto, una classe che implementa l'interfaccia composita può attuare i membri come se avesse ereditato direttamente le interfacce contrastanti. Consumatori dell'interfaccia combinato generalmente non in grado di utilizzare i membri tanto interfaccia componente senza convertire il riferimento a uno degli altri tipi di interfaccia, ma il cast in questione saranno considerate upcast piuttosto che un abbattuto.

Lo schema implementato in .NET funziona bene lì. Purtroppo, non c'è modo di fare qualcosa di simile in Java. Non so che Java sarà squawk se un'interfaccia eredita altre interfacce con i membri contrastanti, ma se non si squawks a quel punto, non ci sarebbe alcun modo per produrre una classe che potrebbe attuarlo.

Non che un nome è stato definito perché interfacce in Java non possono avere implementazione del metodo, il problema è quindi evitato poiché v'è sempre una sola attuazione di un metodo specifico e quindi senza ambiguità sorgerà.

Ho perso il punto o stai parlando la variabile 'c'?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top