2016-03-29 29 views
0

Kalıtımla ilgili bir sorun yaşıyorum (burada Öğrenci). Yaptığım her alt sınıf için 1 tane miras alınmış özel alandan yararlanabilmem gerekiyor. Açıkçası alt sınıflar miras alanlara erişemez, ancak miras alınan özel alanın bu nesnenin bir parçası olduğu yeni bir nesne oluşturulduğunda. Benim amaçlarım için, her bir alt sınıfın, bu miras alan için kendi özel değerine sahip olması gerekir. Kalıtsal alanlar için belirli değerler ekleme

Public class A { 

    private int x = 0; 

    public A(int n) { 

     x = n; 
    } 

    public int useX() { 

     return x; 
    } 
} 

Public class B Extends A { 
    int n = 1; 

    public B() { 
     super(n); 
    } 

    useX(); // Return 1? 
} 

Public class C Extends A { 
    int n = 2; 

    public B() { 
     super(n); 
    } 

    useX(); // Return 2? 
} 

Ancak Profesörlerimin Ayrıca o yeni bir alan yaratmak için benim Süper sınıfın içinde bir ayarlayıcı yöntemi kullanılarak olabileceğini söyle, oradan Kafam karışık: Benim ilk girişimi şuna benzer. Herkes bana doğru yönde yardım edebilir mi?

+1

Gönderdiğiniz kod derlenmiyor ("B" ve "C" de "n" yok ve "süper" den önce hiçbir şey yapamazsınız). Eğer bunu düzeltirseniz, yaklaşımınızın doğru olduğunu düşünüyorum. Bir kurucu kullanmak, değere gereksiz sınırsız erişim vermeden değeri başlatmak için iyi bir yoldur. – resueman

+0

Bildirimlerden yeni ayrıldım. –

cevap

3

Sıradan bir Java Bean alanlar var için publicerişimcileri ve mutators (aka getters ve belirleyiciler) sağlar. Ancak, , ürününün protected ayarlayıcısını sağlayabilir. Bir şey gibi

public class A { 
    private int x = 0; 

    public int getX() { // <-- the usual name. 
     return x; 
    } 

    protected void setX(int x) { 
     this.x = x; 
    } 
} 

Sonra alt sınıfları 1 dönecek ayarlayıcı

public class B extends A { 
    public B() { 
     super(); 
     setX(1); 
    } 
} 

Sonra B.getX() (veya B.useX() Eğer gerçekten tercih ediyorsanız) çağırabilirsiniz.

+1

'A' hiçbir argüman yapıcısı yok, bu yüzden 'super()' bir parametre olmadan çalışmayacak. – resueman

+1

@resueman İyi nokta. Açık yapıcıyı kaldırdı; kesinlikle benim örneğime ihtiyacım yoktu. –

+0

Şu an sahip olduğum bir soru, B sınıfında X (x) ve C sınıfında setX (y) ayarlayacak olsaydım, A sınıfının değerini veya ilgili sınıflarını değiştirir miydi? –

İlgili konular