سؤال

كيف يمكنني الحصول على الفئة الفائقة لمثيل الفصل في Java Me. وهذا هو ، وهمية وظيفة class.getSuperClass () مع الوظائف المحدودة المتاحة في CLDC 1.1؟

ما أريد فعله هو ترك الطبقة الخارقة المجردة تفعل شيئًا كهذا:

public Styler getStylerForViewClass(Class clazz) {
   Styler s = stylers.get(clazz);
   if (s == null) {
     for (Class c = clazz; s == null; c = c.getSuperclass()) {
       if (c == Object.class) {
         throw new IllegalArgumentException("No Styler for " + clazz.getName());
       }
       s = createStylerForViewClass(c);
     }
     stylers.put(clazz, s);
   }
   return s;
}
public Styler createStylerForViewClass(Clazz clazz) {
  if (clazz == View.class) {
    return new DefaultStyler();
  } else {
    return null;
  }
}

يمكن للفصول الفرعية بعد ذلك إضافة تخصصات مثل هذا:

 public Styler createStylerForViewClass(Class clazz) {
   if (clazz == SpecialView.class) {
     return new SpecialStyler();
   } else {
     return super.createSylerForViewClass(clazz);
   }
 }
هل كانت مفيدة؟

المحلول

كما اكتشفت بالفعل ، لا يوفر MIDP طريقة للحصول على الفئة الفائقة للفصل ، ولا لتعداد جميع الفئات في التطبيق.

لذلك كل ما يمكنك فعله هو تتبع التسلسل الهرمي للصف بنفسك.

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

abstract class View {
    protected View() {
        classHierarchy.add(this.getClass());
    }
}

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

تتبع علاقات الفئة الفائقة/الفئة الفرعية لمجموعة فرعية معروفة من الفصول سهلة بما فيه الكفاية. على سبيل المثال:

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

public class ClassHierarchy {
 public ClassHierarchy() {
  childToParentMap = new Hashtable();
  parentToChildMap = new Hashtable();
  parentToChildMap.put(Object.class, new Vector());
 }

 public boolean addClass(Class toAdd) {
  if (toAdd.isInterface()) return false;
  if (toAdd.equals(Object.class)) return false;
  if (childToParentMap.get(toAdd) != null) return false;

  addClassBelow(toAdd, Object.class, new Vector());
  return true;
 }

 public Class getParent(Class subclass) {
  return (Class) childToParentMap.get(subclass);
 }

 private void addClassBelow(Class toAdd, Class parent, Vector initialChildren) {
  Vector children = (Vector) parentToChildMap.get(parent);
  Class reparented;
  do {
   reparented = null;
   for (Enumeration childEnum = children.elements();
        childEnum.hasMoreElements();
        ) {
    Class child = (Class) childEnum.nextElement();
    if (child.isAssignableFrom(toAdd)) {
     addClassBelow(toAdd, child, initialChildren);
     return;
    } else if (toAdd.isAssignableFrom(child)) {
     children.removeElement(child);
     initialChildren.addElement(child);
     childToParentMap.put(child, toAdd);
     // Guard against concurrent modification
     reparented = child;
     break;
    }
   }
  } while (reparented != null);

  children.addElement(toAdd);
  childToParentMap.put(toAdd, parent);
  parentToChildMap.put(toAdd, initialChildren);
 }


 private Hashtable childToParentMap;

 private Hashtable parentToChildMap;
}

ولكن هذا يمكن أن "تفوت" الفصول الوسيطة التي تتم إضافتها لاحقًا ، على سبيل المثال ، إذا كان لديك هذه الفئات:

Object >= View >= A >= B >= C

و أضف A و C إلى الشجرة وطلبتها عن الفئة العظمى من C سوف يعطيك A, ، وإذا أضفت لاحقًا B سوف يحل محل A كقائد فائق C, ، ولكن ليس حتى يتم إعادة الأسلوب الخطأ لبعض الحالات C.

لذلك أعتقد أنه سيتعين عليك إضافة القيود التي يجب إضافتها إلى الشجرة أولاً. ربما من كتلة التهيئة الثابتة للفئة التي تتجاوز createStylerForViewClass, ، أو التهيئة الثابتة لفئة العرض نفسها.

لقد فكرت في أحد الاختراقات الشريرة الأخرى ، لكن لا يمكنني التوصية به حقًا:

  • في ال View مُنشئ ، إنشاء جديد Exception, ولكن لا ترميها.
  • مبادلة مؤقتا System.err لكاتبك الذي يكتب إلى ByteArrayOutputStream
  • يتصل printStackTrace() على الاستثناء
  • يعيد System.err لقيمته الأصلية
  • تحليل تتبع المكدس من ByteArrayOutputStream. ستكون أسماء منشئي الفئات المتوسطة في تتبع المكدس. الآن يمكنك البحث عنها باستخدام Class.forName() وأضفها إلى الشجرة.

نصائح أخرى

لديك خياران:

إذا كنت تعلم أن الفئة الفائقة تنتمي إلى مجموعة محدودة ، فيمكنك فقط استدعاء مثيل أو استخدام class.isinstance () طريقة.

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

 ClassA:SuperClass
 ClassB:AnotherSuperClass
 etc.

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

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