там способ гарантировать, что весь созданный подпроцесс мертв во время выхода программы Python? Подпроцессом я имею в виду созданных с подпроцессом. Popen ().
Вы могли нарушить инкапсуляцию и тест , который все процессы Popen завершили путем выполнения
subprocess._cleanup()
print subprocess._active == []
В противном случае, я должен выполнить итерации по всему изданию, уничтожает и затем уничтожает-9? что-нибудь инструмент для очистки?
Вы не можете удостовериться, что все подпроцессы мертвы, не выходя и уничтожая каждого оставшегося в живых. Но если у Вас есть эта проблема, это, вероятно, потому что у Вас есть более глубокая проблема проектирования.
Используйте абстрактный метод:
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-идиома для такого рода вещей, поэтому люди, смотрящие на их код, не будут ломать голову.
Он не может быть статическим в суперклассе. Эта статическая переменная в суперклассе разделяется (фактически синглтон) всеми подклассами. Каждый раз, когда вы меняете это (например, создавая экземпляр подкласса), это изменение отражается во всех других экземплярах подкласса.
Вместо этого сделайте спрайт статическим в подклассах, а затем используйте структуру метода, описанную Лоуренсом.
Итак, создайте один спрайт и дайте всем переменные экземпляра. Это просто ссылки; чуть больше указателей.
Быстрый тест покажет вам, что да, вы можете переопределить статические переменные в подклассах.
Я собрал простую структуру наследования, чтобы проверить это. 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
Однако для ваших конкретных нужд я рекомендую подход, принятый Лоуренсом Гонсалвесом