2013-08-19 5 views
-2

У меня проблема:java: статические методы и наследование. Есть ли способ обойти это?

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

Я подклассифицировал SuperClass (генератор SubClass), и я смог редактировать частные поля, унаследованные от SuperClass через отражение. Все в порядке до этого момента.

У двигателя есть класс (назовем его Constants), который имеет статические конечные экземпляры множества классов, включая SuperClass, но не мой SubClass, так как он не является частью движка.

Теперь SuperClass.StaticMethod делает эквивалент этого:

public int StaticMethod(int i) 
{ 
    if(i == 0) 
     return Constants.SuperClassInstance.Field_1; 
    else if(i == 1) 
     return Constants.SuperClassInstance.Field_2; 
} 

Оба SuperClass.Field_1 и SuperClass.Field_2 являются частными (и они не являются статичными, люди думали, что они были, поэтому я редактирую вопрос немного), но статический метод имеет видимость их, потому что он является членом SuperClass. Как я уже сказал, мне удалось установить значения этих полей в моем унаследованном SubClass посредством отражения, но из-за того, как работает SupperClass.StaticMethod, как показано выше, это не влияет на него.

Я не думаю, что могу изменить SuperClassInstance.Field_1 и Field_2, иначе я сломал бы SuperClass, немного, но разумно.

Есть ли способ решить это?

+2

Это совсем не ясно * почему * вы пытаетесь нарушить контроль доступа в первую очередь. –

+0

Потому что мне нужен мой класс для совместной работы с движком. Мне нужен движок, чтобы сделать мой SubClass правильно. Я упростил код, потому что в этом суть проблемы, но это проблема рендеринга. – user2212990

+1

Похоже, что двигатель не предназначен для работы таким образом. Сгибающий код против его дизайна почти всегда плохая идея. –

ответ

0

Это кажется мне проблемой XY. Это большая часть ваших проблем с дизайном.

Во-первых, в чем цель приватного статического финала? Так как это окончательно, оно также может быть общедоступным. Это то, что я видел регулярно, но я думаю, что это, как правило, плохая практика.

Создание чего-то статического, по сути делает его глобальным. В случае вещей, подобных синглтону, есть желание скрыть глобальность, статической переменной. Однако обычно есть вспомогательные функции, которые раскрывают полезную функциональность этого «скрытого, глобального».

Похоже, что родительскому классу не хватает тех методов, которые делают родительский класс полностью полезным. Есть ли способ изменить дизайн родительского класса, а не использовать все эти хаки, чтобы ваш проект работал?

+0

Нет, если я не использую отражение, чтобы изменить сам код классов двигателя во время выполнения. Это будет еще больший взлом. – user2212990

+2

«Поскольку это окончательный вариант, он также может быть общедоступным» - нет, он может использоваться для статических методов, не засоряя публичное пространство имен, есть веские причины, по которым вы, возможно, не хотите, чтобы это публично. Статические и публичные ортогональные характеристики. Существуют только вспомогательные функции, если вы хотите, чтобы пользователи имели доступ к скрытой переменной или тому подобное, поэтому существуют разные классификации доступа. – arcy

Смежные вопросы