لماذا لا أستطيع الدخول إلى المحمية طريقة جافا حتى ظننت أنني قد تمتد الطبقة ؟

StackOverflow https://stackoverflow.com/questions/1622219

  •  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);

وبعد ذلك ستجد لديك حق الوصول إلى وظيفة المحمية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top