هل يمكنني الحصول على نسخ مختلفة من متغير ثابت لكل نوع مختلف من فئة الوراء

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

سؤال

أريد أن أحصل على نفس المتغير الثابت مع قيمة مختلفة حسب نوع الفصل.

لذلك سيكون لدي

public class Entity
{
     public static Bitmap sprite;

     public void draw(Canvas canvas, int x, int y)
     {
          canvas.drawBitmap(sprite, x, y, null);
     }
}

public class Marine extends Entity
{

}

public class Genestealer extends Entity
{

}

ثم في برنامجي الرئيسي، تذهب:

Marine.sprite = // Load sprite for all instances of Marine
Genestealer.sprite = // Load sprite for all instances of Genestealer

لا أريد تخزين نفس العفريت في كل حالة من الفصل. أريد واحدة لكل نوع من الصف. أريد أن يرث متغير العفريت الثابت وظيفة السحب التي سترسم العفريت. لكنني لا أريد أن أتجاوز Genstealer Grite The Marine Sprite.

هل هذا ممكن؟

كيف أفعل ذلك؟

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

المحلول

استخدم طريقة مجردة:

public class Entity
{
     public abstract Bitmap getSprite();

     public void draw(Canvas canvas, int x, int y)
     {
          canvas.drawBitmap(getSprite(), x, y, null);
     }
}

public class Marine extends Entity
{
    public Bitmap getSprite() {
        return /*the sprite*/;
    }
}

يمكن أن تكون العفريت التي عادتها GetSprite ثابتة إذا أردت. أشياء لطيفة عن هذا النهج:

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

  • انها مرنة. لنفترض أن البحرية يجب أن تبدو مختلفة بمجرد "المستويات". ما عليك سوى تغيير طريقة GetPrite البحرية لاتخاذ المستوى في الاعتبار.

  • إنه المعنى القياسي OO-IDIOM لهذا النوع من الأشياء، لذلك لن يترك الأشخاص الذين ينظرون إلى رمزهم إلى خدش رؤوسهم.

نصائح أخرى

لا يمكن أن يكون ذلك ثابتا في الطبقة الفائقة. يتم تقاسم هذا المتغير الثابت في الفئة الفائقة (بفعالية Singleton) من قبل جميع الفئات الفرعية. في أي وقت تقوم بتغيير ذلك (قل، عن طريق إنشاء نسخة فرعية)، ينعكس هذا التغيير في جميع مثيلات الطبقة الفرعية الأخرى.

بدلا من ذلك، قم بإجراء SPRITE ثابتة في الفئات الفرعية، ثم استخدم بنية الأسلوب الموصوفة بواسطة Laurence.

كان لدي نفس السؤال وجاء إلى الحل لاستخدام رسم الخرائط الثابتة

فئة -> كائن.

يستخدم مثال التعليمات البرمجية التالي عددا صحيحا كنوع المتغير المطلوب "من الفئة".

import java.util.Map;
import java.util.HashMap;

class C
{
    static Map<Class<?>,  Integer> class2IntegerMap = new HashMap<Class<?>, Integer>();


    public void setClassSpecificInteger(Integer _i)
    {
        class2IntegerMap.put(this.getClass(), _i);
    }

    public Integer getClassSpecificInteger()
    {
        return class2IntegerMap.get(this.getClass());    
    }           
}

class CA extends C
{
}

class CB extends C
{
}

class CAA extends CA
{
}

public class MainClass
{
    public static void main(String []args)
    {
        CA a1 = new CA();
        CA a2 = new CA();
        CB b1 = new CB();
        CB b2 = new CB();
        CAA aa1 = new CAA();

        a1.setClassSpecificInteger(Integer.valueOf(-1));
        b1.setClassSpecificInteger(Integer.valueOf(+33));

        System.out.println("The int-value for a1 is: "+a1.getClassSpecificInteger());
        System.out.println("The int-value for b1 is: "+b1.getClassSpecificInteger());

        System.out.println("The int-value for aa1 is: "+aa1.getClassSpecificInteger());

        System.out.println("The int-value for a2 is: "+a2.getClassSpecificInteger());
        System.out.println("The int-value for b2 is: "+b2.getClassSpecificInteger());

        CA a3 = new CA();
        CB b3 = new CB();

        System.out.println("The int-value for a3 is: "+a3.getClassSpecificInteger());
        System.out.println("The int-value for b3 is: "+b3.getClassSpecificInteger());

        CAA aa2 = new CAA();

        aa2.setClassSpecificInteger(Integer.valueOf(8));

        System.out.println("The int-value for aa1 now is: "+aa1.getClassSpecificInteger());
    } 
} 

الإخراج هو:

The int-value for a1 is: -1
The int-value for b1 is: 33
The int-value for aa1 is: null
The int-value for a2 is: -1
The int-value for b2 is: 33
The int-value for a3 is: -1
The int-value for b3 is: 33
The int-value for aa1 now is: 8

آمل أن يساعد هذا شخص ما. رجاء كن لطيف.

لذا قم بعمل Sprite واحد وإعطاء متغيرات مثيل الجميع. انهم مجرد مراجع؛ بالكاد أكثر من المؤشرات.

سيظهر لك اختبار سريع ذلك، نعم، يمكنك تجاوز المتغيرات الثابتة في الفئات الفرعية.

لقد وضعت بنية ميراث بسيطة لاختبار هذا. Statictest هو الفائقة من statictestsub. كلاهما يعلن Ints ثابت TEST1, TEST2, ، و TEST3 بدرجات متفاوتة من الوصول. لتبسيط المثال، تركت private الإصدار.

public class StaticTest {
    public static int TEST1 = 1;
    protected static int TEST2 = 1;
    static int TEST3 = 1;

    public static void main(String[] args) {
            System.out.println("StaticTest.TEST1: " + StaticTest.TEST1);
            System.out.println("StaticTest.TEST2: " + StaticTest.TEST2);
            System.out.println("StaticTest.TEST3: " + StaticTest.TEST3);
            System.out.println("StaticTestSub.TEST1: " + StaticTestSub.TEST1);
            System.out.println("StaticTestSub.TEST2: " + StaticTestSub.TEST2);
            System.out.println("StaticTestSub.TEST3: " + StaticTestSub.TEST3);
    }
}


public class StaticTestSub extends StaticTest {
    public static int TEST1 = 2;
    protected static int TEST2 = 2;
    static int TEST3 = 2;
}

يمكنك تجربة هذا في المنزل. وضع خارج كان:

statictest.test1: 1.
Statictest.test2: 1.
statictest.test3: 1.
statictestsub.test1: 2.
statictestsub.test2: 2.
statictestsub.test3: 2.

لاحتياجاتك المحددة، ومع ذلك، أوصي النهج الذي اتخذه Laurence Gonsalves

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