Tip

2011-06-22 34 views
8

Şu anda bazı sınıfları yazmaya çalışıyorum ve aşağıdaki sorun karşılaşılmaktadır:Tip

İki arayüzleri

interface IA { 
public void doSomething(); 
} 

interface IB { 
public void doSomethingToo(); 
} 
gelen bazı işlevler uygulayan bir sınıf yazmaya çalışıyorum

Ve o arayüzler uygulayan iki sınıf vardır:

class FooA implements IA, IB{ 

} 

class FooB implements IA, IB{ 

} 

bunu yapabilirim ben yolu var mı:

public <type> thisClassImGonnaUse = returnEitherFooAOrFooB(); 
thisClassImGonnaUse.doSomething(); 
thisClassImGonnaUse.doSomethingToo(); 
Eğer bir soyut temel sınıf veya IA ve IB hem

abstract class Base implements IA, IB{} 

ve

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

böylece 'thisClassImGonnaUse' her iki yönteme de sahip olmalıdır. Bunun neden işe yaramayacağını anlamıyorum. Belki bir şey özlüyorum. –

+0

Eh, evet biraz. Ne tür "thisClassImGonnaUse" var :) –

+0

tamam, düşünüyorum.Tür bir arayüz olmalı ve 2 arayüz olarak belirtilemez. –

cevap

9

yeni bir arayüz

public interface IAandB extends IA, IB 

yapın ve yapmak uzanan başka bir arayüz oluşturabilir

+0

Ah, harika, gerçekten aradığım şey buydu. Bunun için teşekkürler :) –

1

FooA ve FooB bunun yerine uygular.

+1

Bu cevap için teşekkürler. Soyut bir sınıf kullanmayı seçtiniz, bir arayüz kullanmanın farkı ne olurdu? Muhtemelen semantiktir, ama neyin tercih edileceğini gerçekten anlayamıyorum. –

+0

Bu durumda, gerçekten hiçbir şey! Sizin durumunuzda, bir taban sınıfınız olmadığı için, soyut sınıfı kullanmak da bir olasılıktır ve sadece onu dışarı atmak istedi. “Soyut bir temel sınıf ya da başka bir arayüz” diyecektim ve her ikisine de örnekler verdim, ancak diğer cevapları arayüz metodu için örneklerle gördüm, böylece bunun için bir örnek vermedim. –

1

Bu tam olarak ne istediğinizi olmayabilir, ancak her ikisi de uzanan bir 3. arayüzü yapabilir: Doğrudan IAandB yerine IA ve IB uygulayacağını

interface IAandB extends A, B {} 

Sonra FooA ve FooB:

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

Sonra tip IAandB olması için thisClassImGonnaUse ilan edebilir:

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

bir sınıf implementes IAveIB ve bu gerçeğin Çalıştığınız sorun etki alanı için kavramsal olarak mantıklı, sadece bu

interface IAB extends IA, IB { /* nothing */ } 
gibi IAB olması ihtimali varsa 'u numaralı telefondan belirlerseniz, sizin durumunuzda mantıklı gelebilir, kendinize sormak kadar kolay olabilir IAB için iyi bir isim ne olurdu? Bunun için tatmin edici bir cevap bulabilirseniz, sadece bu arayüzü ekleyebilirsiniz. değil ulaşırsa iki

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

hatlar için doğru yer FooA veya FooB bir yöntem (veya bu ikisinin bir taban sınıfı) olacaktır. Bu şekilde, arayüzlerinizi uygulayan sınıfların doğası hakkında tahminler yapmak ya da tahmin yapmak zorunda kalmazsınız (bu, daha sonra ele alınacak geçersiz ya da zahmetli olabilir).

+0

Tamam, ben de bunun için düşünüyordum. Yine de bir sorunum var, arayüzlerden biri ('IA' diyelim) farklı bir kütüphaneden geliyor. –