لماذا لا أستطيع الدخول إلى المحمية طريقة جافا حتى ظننت أنني قد تمتد الطبقة ؟
-
06-07-2019 - |
سؤال
وهنا وثائق محمية الطريقة:
/** Converts jmusic score data into a MIDI Sequence */
protected javax.sound.midi.Sequence scoreToSeq(Score score)
و أنا جعلت هذا القليل الطبقة تمتد الطبقة التي scoreToSeq الأسلوب يأتي من:
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;
}
}
المحلول
(تحرير: theycallmemorty الجواب يعطي نصائح عملية لتجنب هذه المشكلة في حالة الخاصة بك.هذا الجواب يعطي أسباب لماذا يجب عليك اتباع هذه النصيحة ، أيلماذا اللغة وقد تم تصميم هذا الطريق.)
يمكنك فقط الوصول إلى المحمية عضو كائن آخر الذي هو من نفس نوع الوصول إلى التعليمات البرمجية (أو فرعية) - على الرغم من العضو أعلن في supertype.
من تحديد لغة Java القسم 6.6.2:
اسمحوا C تكون الطبقة التي عضو محمية م أعلن.الوصول ويسمح فقط داخل جسم فئة فرعية من C. Sوبالإضافة إلى ذلك, إذا كان معرف يدل مثيل مجال أو مثيل المنهج:
- إذا كان الوصول هو عن طريق الاسم المؤهل س. Id ، حيث س هو ExpressionName, ثم الوصول مسموح به إذا إلا إذا كان نوع من التعبير Q هو S أو فئة فرعية من S.
- إذا كان الوصول هو عن طريق حقل الوصول التعبير هاء الهوية ، حيث E هو الأساسي التعبير, أو عن طريق استدعاء الأسلوب التعبير E. معرف(...), حيث E هو التعبير الأساسي ، ثم الوصول يجوز إذا و فقط إذا كان نوع ه هو S أو فئة فرعية من S.
هذا هو السماح نوع الوصول إلى الأعضاء ذات الصلة الخاصة الميراث شجرة دون هزيمة التغليف من الطبقات الأخرى.على سبيل المثال, لنفترض أن لدينا:
A
/ \
B Other
/
C
و أعلن عضو محمية x
.دون سيادة العامل لا يمكنك أن تحصل على جولة التغليف عن طريق وضع الأعضاء في Other
:
public int getX(A a)
{
return a.x;
}
ومجرد الدعوة التي تمر في مثيل B
أو C
- الأعضاء بشكل فعال من شأنه أن تصبح عامة ، لأنك يمكن أن تعمل دائما من حوله من خلال إدخال فئة أخرى...ليست فكرة جيدة.مع القاعدة الحالية عليك فرعية B
أو C
- التي قد لا تكون قادرة على في المقام الأول.
نصائح أخرى
وعند القيام بذلك:
MidiSynth synth = new MidiSynth();
sequence = synth.scoreToSeq(score);
وأنت لا تأخذ في الواقع الاستفادة من حقيقة أن كنت قد مدد الطبقة MidiSynth.
إذا كنت في محاولة
this.scoreToSec(score);
وبعد ذلك ستجد لديك حق الوصول إلى وظيفة المحمية.