2016-04-04 15 views
1

Şu anda bir Java projesi üzerinde çalışıyorum, soyut sınıf N'den miras alan 3 sınıfım var (I, H ve O). I ve O sınıfları S ve S ve H ve O sınıflarında açıklanan bir özellik gerektirir. P sınıfı. P ve S özellikleri bir arayüzle yapılamaz. Bu soruna neden böyle bir yapıyı uygulamaya olsaydı: N -> P N -> S ve ->, S, O -> S ve O -> P, H -> P
ancak Birden fazla mirasa izin vermediğinden java'da bu imkansızdır. Mantıksal bir çözüm S'nin P ve P'den N'den miras kalmasını sağlamaktır. Fakat bu, P'den ihtiyaç duymadığı özelliklere sahip olmama neden olur.Bu miras yapısını düzeltmenin en iyi yolu nedir?

Bunu uygulamak için temiz bir yol arıyorum, okumalarınız için teşekkürler!

+0

Ne demek '-> '? "Uygular" mı yoksa "uygulandı mı" mı demek istiyorsun? –

+0

Okuma eğilimi -> "kullanımlar" olarak, bu doğru mu? "Mülk" ile tam olarak ne demek istediğini bilmiyorum. Hemen benim düşüncem, UsesP ve UsesS arayüzlerine sahip olmak ve P ve S kullanan sınıflara sahip olmak mı - yoksa söylediğin şey imkansız mıydı? –

cevap

1

Ben ilişkisini: Burada

Bunu nasıl gördüğünü "dedi. bir arayüz ile yapılamaz Hem özellikler P ve S".

Eğer alan değerini almak gerekiyorsa, sadece yöntemlerini tanımlamak gibi, uygulanacak:

public interface MyInterface{ 
void getPropertyOne(); 
void getPropertyTwo(); 
} 

Ve Java arayüzleri varsayılan yöntemleri alabilir Java8 beri unutmayın, bu eğer yararlı olabilir Alt sınıflarınızın bazıları için aynı uygulamaya ihtiyaç duyarsınız veya soyut sınıfları kullanarak benzer bir davranış elde edebilirsiniz.

+0

Teşekkürler Bu gerçekten sorun için iyi bir çözümdür. –

3

Bir arabirimde ortak özellikleri soyutlamaya çalışın.

0

P ve S sınıfında singletonlarınızı yapmanız ve Composition over Inheritance'u kullanmanız gerekir. Başka bir deyişle, P ve S'dan , I, O ve H'un faydalarını kullanabilirsiniz. N'yi soyut olarak bırakın, ancak yalnızca N ortak yöntem ve alan kümesi sağlıyorsa .. Başka bir deyişle = N her sınıf için bir şablondur. için

class I extends N { 
    private S s; 

    public I(S s) { 
     this.s = s; 
    } 
} 

class O extends N { 
    private S s; 
    private P p; 

    public O(S s, P p) { 
     this.s = s; 
     this.p = p; 
    } 
} 

class H extends N { 
    private P p; 

    public H(P p) { 
     this.p = p; 
    } 
} 

interface P { 
    public String getProperty(); 
} 
interface S { 
    public String getProperty(); 
}