2012-05-01 3 views
1

Учитывая на следующем, в псевдокодеСсылки на статических поля подкласса абстрактного класса в теле метода абстрактного класса в

abstract public class Bug { 
    private static int BREEDTIME; 

    public void breed() { 
    if (this.age % this.BREEDTIME) { 
     world.setAt(new this.class(newX, newY, this.world); 
    } 
    } 
} 

public class Ant extends Bug { 
    private static int BREEDTIME = 3; 
} 

public class Doodlebug extends Bug { 
    private static int BREEDTIME = 8; 
} 

Есть ли способ, чтобы определить метод породы() таким образом, что это зависит от BREEDTIME какого подкласса это называется? Каждому подклассу bug гарантируется инициализация BREEDTIME.

Кроме того, муравьи должны размножать других муравьев, поэтому конструктор, называемый внутри breed(), должен быть конструктором типа подкласса, вызывающего породу().

Я здесь лаяю неправильное дерево?

+0

В PHP это называется [* поздно статическое связывание *] (http://php.net/manual/ ru/language.oop5.late-static-bindings.php), но он недоступен на Java. –

ответ

5

Я бы использовал абстрактный метод для этого. Определите getBreedTime() как абстрактный в вашем суперклассе, а затем внесите его в каждый подкласс, чтобы вернуть соответствующую константу.

Вы не можете делать то, что хотите, используя статические поля, подобные этому.

+0

Это решает проблему поля, но не проблема вызова правильного конструктора new Ant() для Ants и т. Д. –

+0

Обычно для этого вы использовали бы фабрику и определяете такой метод, как BugFactory.createAnt(), который возвращает объект Ant , –

+0

@AustinYun. Вы можете использовать аналогичный заводский метод, определенный на абстрактном классе и реализованный в каждом подклассе, чтобы создать экземпляр правильного подкласса. –

0

Невозможно это сделать. Статические поля также наследуются. Просто удалите статическое ключевое слово. Если вы не хотите, чтобы удвоить Интс, то вы можете создать абстрактный метод GetTime или создать перечисление:

abstract class Bug { 
    private int age; 
    public void breed() { 
     if (this.age % BREEDTIME.valueOf(this.getClass().getName()).getTime() == 0) { 
     } 
    } 
} 

class Ant extends Bug { 
} 

class Doodlebug extends Bug { 
} 

enum BREEDTIME { 
    Ant(3), 
    Doodlebug(8); 

    private BREEDTIME(int time) { 
     this.time = time; 
    } 

    public int getTime() { 
     return time; 
    } 

    private int time; 
} 
Смежные вопросы