java هومو متغيرات مجردة في جاوة؟




هومو اريكتوس (9)

أعتقد أن الارتباك الخاص بك مع خصائص C # مقابل الحقول / المتغيرات. في C # لا يمكنك تعريف الحقول المجردة ، حتى في فئة مجردة. ومع ذلك ، يمكنك تحديد الخصائص المجردة لأن هذه الطرق هي بفعالية (على سبيل المثال مترجمة إلى get_TAG() و set_TAG(...) ).

كما ذكر البعض ، يجب ألا يكون لديك حقول / متغيرات عامة في الفصول الدراسية ، حتى في C #. لقد ألمحت عدة إجابات إلى ما أوصي به ، ولكني لم أوضحه. يجب أن تترجم فكرتك إلى Java كخاصية JavaBean ، باستخدام getTAG (). بعد ذلك ، سيتعين على فصولك الفرعية تنفيذ ذلك (لقد كتبت أيضًا مشروعًا بفصول الجدول التي تقوم بذلك).

حتى تتمكن من الحصول على فئة مجردة محددة مثل هذا ...

public abstract class AbstractTable {

    public abstract String getTag();
    public abstract void init();

    ...
}

بعد ذلك ، في أي فئات فرعية محددة ، ستحتاج إلى تحديد متغير نهائي ثابت (ثابت) getTag() من getTag() ، شيء من هذا القبيل:

public class SalesTable extends AbstractTable {

    private static final String TABLE_NAME = "Sales";

    public String getTag() {
        return TABLE_NAME;
    }

    public void init() {
        ...
        String tableName = getTag();
        ...
    }

}

تحرير :

لا يمكنك تجاوز الحقول الموروثة (إما في C # أو Java). ولا يمكنك تجاوز أعضاء ثابت ، سواء كانت حقول أو أساليب. لذلك هذا هو الحل الأفضل لذلك. لقد غيّرت مثال طريقة init أعلاه لإظهار كيفية استخدام ذلك - مرة أخرى ، فكر في طريقة getXXX كخاصية.

أنا قادم من c # حيث كان هذا سهلًا وممكنًا.

لدي هذا الرمز:

public abstract class clsAbstractTable {

    public abstract String TAG;
    public abstract void init();

}

لكن Eclipse يقول لي إنني أستخدم معدلاً غير قانوني.

لدي هذا الفصل:

public class clsContactGroups extends clsAbstractTable {


}

أريد المتغير وطريقة محددة بهذه الطريقة ، أن الكسوف ليطالبني ، لدي غير متغيرات مجردة وطرق غير متطورة.

كيف أحتاج إلى تعريف صفّتي التجريديّة لذا يجب أن يُطلب منك تنفيذ الملخصات؟

تعديل 1

سأقوم بإنشاء فئات مختلفة لجداول ديسيبل مختلفة. يجب أن يكون لكل فئة متغير TABLENAME الخاص بها ، بدون استثناء. يجب أن أتأكد من أن هذا المتغير ثابت في كل مرة عندما أقوم بإنشاء فئة جديدة تمدد فئة الملخص.

ثم في الصف التجريدي سيكون لدي طريقة على سبيل المثال: init ()؛

إذا كنت في طريقة init () هذه اتصل بـ TABLENAME ، فيجب أن تأخذ القيمة من الفئة الفرعية.

شيء من هذا القبيل يجب أن ينجح أيضًا

String tablename=(clsAbstract)objItem.TABLENAME;
// where objItem can be any class that extended clsAbstract;

تحرير 2

أريد ثابت (ثابت) محدد في كل فصل مع تحديد اسمه في الملخص.

  • أقوم بتعريف TABLENAME متغير في مجردة ، ولكن لم يتم إعطاء أي قيمة.
  • أقوم بإنشاء clsContactGroups ، يجب أن تتم مطالبتي بتنفيذ TABLENAME ، حيث تحصل على بعض البيانات. على سبيل المثال: TABLENAME = "contactgroups"؛
  • أقوم بإنشاء clsContacts من الدرجة الثانية ، يجب أن تتم مطالبتي بتنفيذ TABLENAME ، حيث تحصل على بعض البيانات. على سبيل المثال: TABLENAME = "جهات الاتصال" ؛
    إلخ...

لا ، جافا لا تدعم المتغيرات المجردة. لا يوجد الكثير من المعنى.

ما هو التغيير المحدد في "تنفيذ" المتغير الذي تتوقع أن تقوم به فئة فرعية؟

عندما يكون لدي متغير String abstract في الفئة الأساسية ، ما الذي يجب على الفئة الفرعية القيام به لجعلها غير مجردة؟


لا يوجد شيء مثل المتغيرات المجردة في جافا (أو C ++).

إذا كان للصف الرئيسي متغير ، وتمتد الفئة الفرعية للوالد ، فلن يحتاج الطفل إلى تنفيذ المتغير. انها فقط تحتاج إلى الوصول إلى مثيل الأم. إما الحصول على / تعيين أو الوصول المحمي سوف تفعل.

"... لذلك يجب أن يُطلب منك تنفيذ الملخصات"؟ إذا قمت بتوسيع فئة تجريدية وفشلت في تنفيذ طريقة مجردة ، سيخبرك المترجم إما بتنفيذها أو وضع علامة على الفئة الفرعية كمجرد. هذا كل ما تطلبه.


تغيير الرمز إلى:

public abstract class clsAbstractTable {
  protected String TAG;
  public abstract void init();
}

public class clsContactGroups extends clsAbstractTable {
  public String doSomething() {
    return TAG + "<something else>";
  }
}

وبهذه الطريقة ، سيكون لدى كل الفئات التي ترث هذا الصف هذا المتغير. يمكنك القيام بـ 200 فئة فرعية ومازال لكل واحد منهم هذا المتغير.

ملاحظة جانبية: لا تستخدم CAPS كاسم متغير ؛ الحكمة الشائعة هي أن جميع معرفات الحروف تشير إلى الثوابت ، أي قطع البيانات غير القابلة للتغيير.


أفضل ما يمكن أن تفعله هو أن يكون لها موصل / موتور للمتغير.
شيء مثل getTAG ()
وبهذه الطريقة ، يجب على جميع الفئات المنفّذة تنفيذها.

يتم استخدام فصول الملخص لتعريف السلوك التجريدي وليس البيانات.


فقط قم بإضافة هذا الأسلوب إلى الفئة الأساسية

public abstract class clsAbstractTable {

    public abstract String getTAG();
    public abstract void init();

}

الآن يجب أن توفر كل فئة تمد الطبقة الأساسية (ولا تريد أن تكون مجردة) TAG

يمكنك أيضا الذهاب مع إجابة BalusC


لإضافة بيانات وصفية للفئة ، قد يكون التعليق التوضيحي هو الطريقة الصحيحة للانتقال.

ومع ذلك ، لا يمكنك فرض وجود تعليق توضيحي في الواجهة ، تمامًا كما لا يمكنك فرض أعضاء ثابت أو وجود مُنشئ معين.


هناك طريقتان لتحديد خصائص مجردة في جافا دون وضع علامة على خاصية كمجرد.

الطريقة الأولى: تحديد منشئ معلمات في الفئة المجردة ، شيء من هذا القبيل:

public abstract class clsAbstractTable {
       private String TAG;
       public clsAbstractTable (String TAG) {
            this.TAG= TAG;
       }
}

عند تعريف مُنَظِّم بارامترميد في فئة مجردة ، تُجبر الفئات الفرعية على تعريف منشآتها الخاصة وتسمية المنشئ السوبر ، ومن ثم تمرير TAG الخاصة بها.

الطريقة الثانية: تحديد الخاصية كطريقة getter ، مثل:

public abstract class clsAbstractTable {
    public abstract String getTAG();
}

بهذه الطريقة يتم تفويض قيمة خاصية TAG لكل فئة محددة.

المصدر: تعريف خاصية مجردة في جافا


تحديد منشئ في الطبقة المجردة التي تحدد المجال بحيث تكون تطبيقات ملموسة وفقا للمواصفات المطلوبة لاستدعاء / تجاوز المنشئ.

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

public abstract class AbstractTable {
    protected String name;

    public AbstractTable(String name) {
        this.name = name;
    }
}

عند توسيع AbstractTable ، لن يتم تجميع الصف حتى تقوم بإضافة مُنشئ يستدعي super("somename") .

public class ConcreteTable extends AbstractTable {
    private static final String NAME = "concreteTable";

    public ConcreteTable() {
        super(NAME);
    }
}

بهذه الطريقة ، يتعين على المنفذين تعيين name . وبهذه الطريقة ، يمكنك أيضًا إجراء عمليات فحص (خالية) في منشئ الطبقة المجردة لجعلها أكثر قوة. على سبيل المثال:

public AbstractTable(String name) {
    if (name == null) throw new NullPointerException("Name may not be null");
    this.name = name;
}




abstract