هل يمكنني جعل فردية محمية في جافا؟ أريد الوصول إليها من فئة فرعية

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

  •  25-09-2019
  •  | 
  •  

سؤال

أنا جديد على جافا وأوب ،

كنت أستخدم فئة فرعية خاصة (في الواقع هيكل) B في الفئة A ، وكل شيء سار على ما يرام حتى قررت أن أجعل الفئة الوالدية C للفئة الفرعية B.

علي سبيل المثال:

public class A {
   private class B extends C {
       public int product;
       public int x;
       public int y;
       public void add() {
             product=x+y;
       }
   }
   B b=new B;
   b.x=1;
   b.y=2;
   b.multiply();
   System.out.println(b.product+"="+b.x+"x"+b.y);

public class C {
   protected int x;
   protected int y;
   public int sum;
   public C(px,py) {
       x=px;
       y=py;
   }
   public void sum() {
       sum=x+y;
   }
}

وأنا أحصل

مُنشئ Super Super Constructor C () غير محدد للمنشئ الافتراضي. يجب تحديد مُنشئ صريح

بالطبع ، يمكنني إزالة تمديد C ، والعودة إلى ما كان لدي من قبل. أو يمكنني صنع getter/setter. لكنني أعتقد أنه من المفهوم أن البنية الداخلية مقبولة ، ويجب أن تكون قادرة على توسيع فصول أخرى.

هل كانت مفيدة؟

المحلول

رسالة البرمجيات واضحة بشكل معقول - في ب أنت على نحو فعال حصلت:

public B() {
    super();
}

وهذا فشل لأنه لا يوجد مُنشئ بدون معلمة في C للاتصال. إما تقديم مُنشئ بدون معلمة ، أو توفير مُنشئ صريح في B يدعو المُنشئ في C مع الوسائط المناسبة.

لست متأكدًا من أنه من الجيد أن يكون لديك كل هذه الحقول غير الخاصة ، ضع في اعتبارك - كما أنها ليست فكرة جيدة للحقول في B لإخفاء الحقول في C. هل حقا تريد مثال ب أن يكون اثنين x الحقول واثنان y مجالات؟ أنت تدرك أنها ستكون حقول منفصلة ، أليس كذلك؟

إذا كنت ترغب فقط في توفير وصول للجمهور بشكل فعال ، فيمكنك:

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

public int getX() {
    return x;
}

(ونفس الشيء عن y) وإزالة الحقول الإضافية من B. لا يمكنك تغيير إمكانية الوصول الفعلي للحقول في C.

نصائح أخرى

حسنًا ، كنت أتعامل مع الكود الخاص بي ووجدت أن المشكلة هي أنني بحاجة إلى مُنشئ افتراضي محمي لـ Supercleass C. يعمل الآن ...

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