java - نياندرتال - هومو اريكتوس




متغيرات مجردة في جاوة؟ (8)

أنا قادم من 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 = "جهات الاتصال" ؛
    إلخ...

أعتقد أن الارتباك الخاص بك مع خصائص 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 كخاصية.


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

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


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

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

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;
}

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

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 كاسم متغير ؛ الحكمة الشائعة هي أن جميع معرفات الحروف تشير إلى الثوابت ، أي قطع البيانات غير القابلة للتغيير.


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

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


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

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

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


لماذا تريد أن تحدد كل الفئات الفرعية المتغير؟ إذا كان من المفترض أن تحتوي كل فئة فرعية عليها ، فقط عرّفها في الطبقة الفائقة. راجع للشغل ، بالنظر إلى أنه من الممارسات الجيدة في OOP عدم الكشف عن الحقول على أي حال ، فإن سؤالك يجعل الأمر أقل منطقية.


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

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

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 لكل فئة محددة.

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





abstract