У меня могут быть различные копии статической переменной для каждого другого типа наследующего класса

там способ гарантировать, что весь созданный подпроцесс мертв во время выхода программы Python? Подпроцессом я имею в виду созданных с подпроцессом. Popen ().

Вы могли нарушить инкапсуляцию и тест , который все процессы Popen завершили путем выполнения

subprocess._cleanup()
print subprocess._active == []

В противном случае, я должен выполнить итерации по всему изданию, уничтожает и затем уничтожает-9? что-нибудь инструмент для очистки?

Вы не можете удостовериться, что все подпроцессы мертвы, не выходя и уничтожая каждого оставшегося в живых. Но если у Вас есть эта проблема, это, вероятно, потому что у Вас есть более глубокая проблема проектирования.

7
задан skaffman 19 September 2009 в 08:09
поделиться

4 ответа

Используйте абстрактный метод:

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, может быть статическим, если хотите. Хорошие моменты в этом подходе:

  • Вы не можете (легко) забыть включить спрайт в свой подкласс, поскольку компилятор будет жаловаться, если вы не реализуете абстрактный метод.

  • Он гибкий. Предположим, морской пехотинец должен выглядеть по-другому, когда он «повысится». Просто измените метод Марин getSprite, чтобы он учитывал уровень.

  • Это стандартная OO-идиома для такого рода вещей, поэтому люди, смотрящие на их код, не будут ломать голову.

13
ответ дан 6 December 2019 в 15:24
поделиться

Он не может быть статическим в суперклассе. Эта статическая переменная в суперклассе разделяется (фактически синглтон) всеми подклассами. Каждый раз, когда вы меняете это (например, создавая экземпляр подкласса), это изменение отражается во всех других экземплярах подкласса.

Вместо этого сделайте спрайт статическим в подклассах, а затем используйте структуру метода, описанную Лоуренсом.

1
ответ дан 6 December 2019 в 15:24
поделиться

Итак, создайте один спрайт и дайте всем переменные экземпляра. Это просто ссылки; чуть больше указателей.

0
ответ дан 6 December 2019 в 15:24
поделиться

Быстрый тест покажет вам, что да, вы можете переопределить статические переменные в подклассах.

Я собрал простую структуру наследования, чтобы проверить это. StaticTest - это супер StaticTestSub. Оба они объявляют статические ints TEST1 , TEST2 и TEST3 с разной степенью доступа. Чтобы упростить пример, я исключил частную версию .

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

Однако для ваших конкретных нужд я рекомендую подход, принятый Лоуренсом Гонсалвесом

-1
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: