2011-06-22 20 views
8

Obecnie próbuję napisać jakieś zajęcia, a ja się spotkałem następujący problem:Rodzaj klasy, która implementuje wiele interfejsów

Próbuję napisać klasę implementującą niektórych funkcji z dwoma interfejsami

interface IA { 
public void doSomething(); 
} 

interface IB { 
public void doSomethingToo(); 
} 

I mam dwie klasy wykonawczych tych interfejsów:

class FooA implements IA, IB{ 

} 

class FooB implements IA, IB{ 

} 

Czy istnieje sposób ja mogę to zrobić:

public <type> thisClassImGonnaUse = returnEitherFooAOrFooB(); 
thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 
+0

, więc 'thisClassImGonnaUse' powinno mieć dostępne obie metody. Nie rozumiem, dlaczego to nie zadziała. Może coś mi brakuje. –

+0

Cóż, tak, trochę. Jakiego typu 'thisClassImGonnaUse' ma :) –

+0

ok, myślę, że mam to.Typ musi być interfejsem, a 2 interfejsy nie mogą być określone jako . –

Odpowiedz

9

Czy nowy interfejs

public interface IAandB extends IA, IB 

i uczynić FooA i FooB implementują go zamiast tego.

+0

Ach, niesamowite, to było to, czego szukałem. Dzięki za to :) –

1

można utworzyć abstrakcyjna klasa podstawowa lub inny interfejs, który rozciąga się zarówno IA i IB

abstract class Base implements IA, IB{} 

i

class FooA extends Base implements IA, IB{...} 
+1

Dzięki za tę odpowiedź. Zdecydowałeś się użyć klasy abstrakcyjnej, jaka byłaby różnica w porównaniu z interfejsem? Jest to prawdopodobnie semantyczne, ale nie wiem, co byłoby lepsze. –

+0

W tym przypadku nic tak naprawdę! W twoim przypadku, ponieważ nie masz klasy bazowej, używanie klasy abstrakcyjnej jest również możliwe i po prostu chciałeś ją tam rzucić. Chciałem powiedzieć "abstrakcyjną klasę bazową lub inny interfejs" i podać przykłady dla obu, ale widziałem inne odpowiedzi z przykładami dla metody interfejsu, więc nie podałem przykładu. –

1

To może nie być dokładnie to, co chcesz, ale można zrobić 3rd interfejs, który rozciąga się zarówno z nich:

interface IAandB extends A, B {} 

Then FooA i FooB byłoby wdrożyć IAandB zamiast IA i IB bezpośrednio:

class FooA implements IAandB{} 
class FooB implements IAandB{} 

Następnie można zadeklarować, że thisClassImGonnaUse ma być typu IAandB:

public IAandB thisClassImGonnaUse = returnEitherFooAorFooB(); 
thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 
0

Jeżeli istnieje możliwość, że klasa implementes IAiIB, i fakt ten sprawia, że ​​koncepcyjnie sens dla domeny problemu jesteś w pracy, sprawiedliwy mieć IAB takiego

interface IAB extends IA, IB { /* nothing */ } 

Czy określić , czy ma sens w Twojej sprawie może być tak proste, jak zadając sobie , co byłoby dobre imię IAB? Jeśli możesz znaleźć satysfakcjonującą odpowiedź, możesz po prostu dodać ten interfejs. Jeśli nie, to właściwe miejsce dla dwóch

thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 

linii byłaby metoda FooA lub FooB (lub klasy bazowej z tych dwóch). W ten sposób nie musisz wykonywać rzutów ani zgadywania o naturze klas implementujących twoje interfejsy (które mogą stać się nieważne lub kłopotliwe w obsłudze).

+0

Dobra, tak też myślałem o tym. Mam jednak jeden problem, jeden z interfejsów (powiedzmy "IA") pochodzi z innej biblioteki. –

Powiązane problemy