هل يمكنني جعل فردية محمية في جافا؟ أريد الوصول إليها من فئة فرعية
سؤال
أنا جديد على جافا وأوب ،
كنت أستخدم فئة فرعية خاصة (في الواقع هيكل) 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. يعمل الآن ...