2009-04-11 18 views
6

Java'da bir alt sınıf metodunun bir alt sınıfın üyeleri için görünmeyeceği bir dil özelliği olup olmadığını merak ediyorum:Java'da korumalı sınıf yapısı?

 public class Subclass extends protected Superclass 

veya bir şey. Bir örnek vereceğim.

İşte süper sınıfınız.

public class A{ 
    public String getA(){...} 
    public String getB(){...} 
    public String getC(){...} 
    public void setA(String a){...} 
    public void setB(String b){...} 
    public void setC(String c){...} 
} 

Bazı yöntemlerini korurken A sınıfı alt sınıflara ayırmak istiyorsanız ve bunları değiştirmedikçe yöntemlerde erişim değiştiricilerini değiştiremezseniz, bu gibi bir şeye sahip olursunuz:

public class B extends A{ 
    private String getA(){return super.getA();} 
    private String getB(){return super.getB();}//These four methods have 
    private void setA(String a){super.setA(a);}//to be redeclared. 
    private void setB(String b){super.setB(b);} 

    public String getC(){return super.getC();}//These two methods can be 
    public void setC(String c){super.setC(c);}//removed. 
    public String getD(){...} 
    public void setD(String d){...} 
} 

Ya da özel bir A örneğini saklayabilir ve böyle bir şeye sahip olabilirsiniz:

public class B{ 

    private A obj; 

    private String getA(){return obj.getA();} 
    private String getB(){return obj.getB();}//These four methods can also 
    private void setA(String a){obj.setA(a);}//be removed. 
    private void setB(String b){obj.setB(b);} 

    public String getC(){return obj.getC();}//These two methods are 
    public void setC(String c){obj.setC(c);}//redeclared. 
    public String getD(){...} 
    public void setD(String d){...} 
} 

Her iki yöntemde de tekrar etmek zorunda kalmamanız gereken bir şey var mı?

cevap

10

C++ durum aksine Java hayır "kamuya açık olmayan" miras yoktur.

Kalıtım bir alt tiplemesi ilişkisini oluşturur. B'nin herhangi bir örneği aynı zamanda A'nın bir örneğidir ve aynı mesajlara cevap vermelidir. B örnekleri, A'nın örneklerine verdiği tüm mesajlara açıkça yanıt vermiyorsa, miras, yine de uygun olmayacaktır.

edilen en son solüsyon (B A'dan devralan etmez) uygun bir şekilde yapılır: (gizlice) diğer uygulamak için bir tür kullanın subtiplemesi ilişkisi oluşturmaz. superclass gizli olarak alanlar/yöntemleri ayarı dışında

+0

+1. –

+0

İleri C++ öğretmek için kullanılırken, alt yazı ilişkilerini göstermek için venn şemaları çizdim ve alt sınıfların içinde ve dışında görülenleri gösterdim, kavramı göstermenin çok etkili olduğunu buldum. Ancak, sık sık, değerinden daha fazla sorun olduğunu hissettim. – Uri

2

, bu etrafında bir yol yoktur sanmıyorum.

bence senin en iyi B sınıfı özel sınıf A.

3

başvurusunu ben öyle düşünmüyorum veya mümkün olmalıdır tutan ikinci seçeneği olurdu. B A uzanan bir A nesnesi olarak bir B nesnesi kullanmak mümkün olmalıdır böylece

Eğer miras kullanın. Örneğin, bu mümkün olacaktır:

A obj = new B(); 

Şimdi program A'nın kamu yöntemlerden bazıları arayamayacağımı bilmenin bir yolu vardır.

Ve miras olmadan

, fonksiyonların yeniden tanımlanması kaçınılmazdır. C++ (korunan ve özel mirasa sahip olan) ile karşılaştırılmak üzere