2009-10-25 8 views
7

İşte korumalı yöntem için dokümantasyon var:Neden korumalı java yöntemine erişemiyorum dersi uzattığımı düşündüm?

/** Converts jmusic score data into a MIDI Sequence */ 
protected javax.sound.midi.Sequence scoreToSeq(Score score) 

Ve scoreToSeq yöntemi geliyor sınıfını genişletmek için bu küçük sınıf yapılan:

public class MidiSequence extends MidiSynth{ 

    public Sequence getSequence(Score score){ 
     MidiSynth synth = new MidiSynth(); 
     Sequence sequence = null; 
     try 
     { 
        // Here I get the error saying that the method has 
        // protected access in MidiSynth 
      sequence = synth.scoreToSeq(score); 

     } 
     catch (InvalidMidiDataException e) 
     { 
      /* 
      * In case of an exception, we dump the exception 
      * including the stack trace to the console. 
      * Then, we exit the program. 
      */ 
      e.printStackTrace(); 
      System.exit(1); 
     } 

     return sequence; 

    } 
} 
+0

Najib Tounsi'den (yorum için yeterli sayıda temsilci yok): olsa bile, synth.scoreToSeq (puan); 'yasal olmalıdır. –

cevap

16

(DÜZENLEME: theycallmemorty's answer önlenmesi açısından pratik tavsiyeler veriyor Bu sorun sizin durumunuzda. Bu cevap neden bu tavsiyeyi takip etmenizin gerekçelerini, yani dilin neden bu şekilde tasarlandığını gösterir.)

Sadece bir proteine ​​erişebilirsiniz Üye, bir üst düzeydeki bildirilmiş olsa bile, erişim koduyla (veya bir alt sınıfla) aynı türde olan başka bir nesnenin kopyasını. Java Language Specification, section 6.6.2 itibaren

:

Let C korumalı üyesi m ilan edildiği sınıf olmak. Id daha sonra bir örnek alanı veya örneğin yöntemi anlamına geldiğinde erişim , sadece ek olarak C'lik bir alt S gövdesi içinde izin verilir: erişim yetkili bir adıyla ise

  • Q.Id Q, bir ExpressionName olduğu, sonra erişimine izin verilmişse, ve erişim alanı erişim ifadesi ile E.Id ise, sentezleme Q tipi, S veya S
  • bir alt sınıfı olduğu takdirde E, Birincil ifadesidir veya bir yöntem çağrısı ile ifade E.Id (.), W Burada E İlköğretim ifade daha sonra erişim izin verilir, eğer ve E tipi S veya S
  • bir alt sınıf Bu bir tür alakalı üyelerini erişmesine izin vermektir

yalnızca diğer sınıfların kapsüllemesini bozmadan kendi miras ağacı.

 A 
    /\ 
    B Other 
/
C 

ve A korumalı üyesi x ilan: Örneğin, olduğunu varsayalım. neden bu şekilde çalışma kural olmadan, Other bir üyeyi koyarak yuvarlak kapsülleme alabilir:

public int getX(A a) 
{ 
    return a.x; 
} 

ve sadece B veya C örneği geçen böyle hitap - üye etkili bir kamu haline çünkü sen ediyorum her zaman başka bir sınıf sunarak etrafta çalışabilir ... iyi bir fikir değil. Geçerli kural ile, ilk etapta edemeyeceğiniz B veya C alt sınıflarına sahip olmanız gerekir. Bunu yaparak

+1

Ben (çoğunlukla) JLS alıntılarını :-) anladığımı düşünüyorum, ancak counterexample ikna edici görünmüyor. Korunan alan x, B veya C üzerinde değil, bu yüzden Diğer'i görmek için iyi olmalıdır. B veya C'den diğer alanları göstermez. Tabii ki bu, "spec diyor ki" cevabından beri saç spreyi oluyor. Bu nedenle, spekülasyonu değiştirmemiz bizim için çok uygun değil :-) –

+0

@Jon Ne yapmalı? İkinci son satırında "başka bir sınıf sunarak her zaman etrafta çalışabilirsin" demek istiyorsun? – Geek

+1

@Geek: Herkes sadece A'yu genişleten ve * A'nın diğer * alt sınıfının bir örneğine erişim sağlayan başka bir sınıf oluşturabilir. –

12

:

MidiSynth synth = new MidiSynth(); 
sequence = synth.scoreToSeq(score); 

Sen aslında MidiSynth sınıfını uzattığımızı aslında yararlanarak değildir.Eğer

this.scoreToSec(score); 

kalksak

O zaman korumalı fonksiyona erişebilir göreceksiniz.

+4

Veya MidiSynth yerine yeni bir MidiSequence oluşturarak (ve ayrıca synth değişkeninin türünü de değiştirerek). –