У меня есть объявленный статический финал и дополнительно заморожен.Переопределение публичного конечного статического замороженного набора в Java/Gosu?
class MyParent {
public final static var MY_FIELDS : Set<MyParent> = {
FIELD1, FIELD2, FIELD3, FIELD4, FIELD5
}.freeze()
}
Теперь, поскольку MyParent.MY_FIELD вызывается из нескольких мест, чтобы сделать некоторые магические вещи, я хотел бы взять на себя пользу этого и просто переопределить саму коллекцию.
class MyChild extends MyParent {
public override static var MY_FIELDS : Set<MyChild> = {
FIELD1, FIELD3, FIELD5, FIELD8, FIELD9, FIELD10
}.freeze()
}
Я также пробовал использовать ключевое слово new
, как это сделано в .NET.
class MyChild extends MyParent {
public new static var MY_FIELDS : Set<MyChild> = {
FIELD1, FIELD3, FIELD5, FIELD8, FIELD9, FIELD10
}.freeze()
}
Однако обходной путь не работал. Затем я прочитал, что это возможно благодаря размышлению.
И потом, я не могу получить доступ к методу getClass()
или class
член моего типа, ни MyParent
«s.
Есть ли какое-либо обходное решение, которое позволило бы мне достичь этого и как?
Использование Gosu 8.0 в проекте Guidewire.
Вам не следует бороться с вашим языком программирования. Кроме того, кажется, вы не знаете, чего хотите. Вы хотите изменить родительское поле, хотите ли вы его переопределить или хотите создать новое поле с тем же именем? Все три вопроса упоминаются в вашем вопросе. И никто из них не может решить вашу проблему, поскольку все они подразумевают, что вы хотите переменную 'static' (я даже не говорю о ее неизменной природе здесь), чтобы делать то, что не делают переменные' static'. – Holger
Фактически, все, что я хочу, это переопределить значение, возвращаемое статической переменной через производный класс, поэтому создание экземпляра производного класса позволит статической переменной возвращать поля, специфичные для нее. –
Это просто невозможно, поскольку это противоречит переменным 'static': переменные, которые существуют * ровно один раз *. Определение в классе предоставляет пространство имен и правила доступа, но в принципе каждая переменная 'static' является только глобальной переменной. Как сказано, факт, что переменная является «final», здесь даже не имеет отношения к делу. Обратите внимание, что даже если поле не было 'static', код базового класса не будет получать доступ к полю подкласса, если вы определяете поле с тем же именем. Это потребовало бы, чтобы метод nonstatic * * имел что-то, что вы можете переопределить в подклассе. – Holger