2016-06-15 15 views
23

Mam kilka interfejsów:Jak utworzyć metodę akceptowania instancji za pomocą dwóch interfejsów?

public interface Speaker { 
    void speak(); 
} 

public inteface Walker { 
    void walk(); 
} 

chcę metodę, która pobiera instancje, które są zarówno Speaker i Walker.

Teraz mogę realizować inny interfejs:

public interface WalkerSpeaker extends Walker, Speaker { 

} 

i przyjąć, że:

void walkAndTalk(final WalkerSpeaker x) { 
    x.walk(); 
    x.speak(); 
} 

Ale to jest dość skomplikowana z wielu kombinacji, a każda realizacja musi dziedziczyć WalkerSpeaker go do pracy !

Czy istnieje lepszy sposób?

+1

To jest prawie jak to jest. Jeśli stanie się nieporęczna, możesz spojrzeć na swój projekt. – Underbalanced

+2

@Ravindrababu Twoja odpowiedź na to łącze jest tak samo kłopotliwa i bardzo sztywna, że ​​nie można jej łatwo powiększyć ani zmienić. – Underbalanced

+0

fyi: Dobrą praktyką jest używanie 'narzędzi' zamiast 'rozszerzeń' dla interfejsów. – Akunosh

Odpowiedz

53

Można to osiągnąć z rodzajowych następująco

public <T extends Speaker & Walker> void walkAndTalk(T x) { 
    x.walk(); 
    x.speak(); 
} 

Parametr typu T będzie „podwójnie ograniczony” do obu interfejsów, więc w istocie T będzie WalkerSpeaker chyba nie trzeba pisać oddzielny interfejs dla niego.

+0

Idealny. Czy jest jakiś napowietrznych do tego v.s. używając dodatkowego interfejsu? Wyobrażam sobie, że nie ze względu na wymazywanie typu. – sdgfsdh

+3

Ponieważ generics są usuwane podczas kompilacji, nie ma. Nie to ma znaczenia, ponieważ wydajność jest większym problemem niż jakaś przypadkowa metoda. – Kayaman

+4

+1, Bardzo fajny pomysł na to rozwiązanie, ale nie podoba mi się pomysł, że obiekt można oglądać z dwóch różnych natur w tej samej metodzie. Wydaje się, że metoda walkAndTalk ma więcej niż jedną odpowiedzialność, więc łamie zasadę Pojedynczej odpowiedzialności. –