2010-08-17 3 views
2

Это, вероятно, имеет очень простое решение, но я не могу понять его ...
У нас есть куча классов формы xQuantity, например. DistanceQuantity, AreaQuantity и т. Д., Которые расширяют класс DimensionQuantity. Теперь вы можете добавлять или вычитать свойства DistanceQuantity или AreaQuantity и т. Д., Но вы не можете их смешивать. Все подклассы имеют такие методы, как add(), subtract(), ge() и т. Д., Поэтому было бы неплохо поместить общую логику в DimensionQuantity, но я продолжаю сталкиваться с проблемами с литьем.Возвращаемый объект динамически распределенного класса из метода

До сих пор лучшее, что я придумал, это сгенерировать объект, а затем применить его в методе подкласса, но было бы неплохо избавиться от подкласса add() (и других подобных методов) вообще ! Вот код (с некоторыми вещи опущены):

В DistanceQuantity:

public DistanceQuantity add(DistanceQuantity d1) { 
Object o = new DistanceQuantity(scalar + d1.scalar, REF_UNIT);  
return (DistanceQuantity) o; 
    } 

В DimensionQuantity:

@SuppressWarnings({"rawtypes", "unchecked"}) 
    public Object add(DimensionQuantity d1) { 

Class c1 = this.getClass(); 
Class c2 = d1.getClass(); 
if (c1 != c2) 
    throw new RuntimeException(); 
double d = scalar + d1.scalar; 
Constructor c = null; 
c = c1.getConstructor(Double.TYPE, AbstractUnit.class); 
Object o = null; 
o = c.newInstance(d, REF_UNIT); 
return o; 
    } 

Может кто-нибудь (или кому-то) предложить лучший способ ?!

+0

Какая версия C поможет :) – Basic

+1

Похож на Java для меня. – EboMike

+0

Ну, это отвечает на этот вопрос. Я не знаю, re: java, но это похоже на то, что вам нужно смотреть на генераторы. – Basic

ответ

1

Используйте объявление класса следующим образом: class Dimension<T extends Dimension<T>> {...}. Это позволяет указать подкласс типа class AreaDimension extends Dimension<AreaDimension> {...}.

Отметьте, что я думаю, что вы делаете это неправильно - если у вас есть расстояния, площади, тома, то просто добавьте дополнительно к значению, экспоненте или размерности - простое расстояние имеет размерность 1, область имеет 2, том имеет 3. Это позволяет выполнять умножение и деление должным образом.

Если у вас будет более одного устройства, используйте перечисление для различных единиц и массив для каждого измерения.

+0

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

0

Эта проблема в значительной степени ушла - я нашел совсем другое решение, поэтому считаю, что этот ответ закроет этот вопрос! Тем не менее, он вызвал связанный с этим вопрос о том, как можно получить объект «макро» или «шаблон» на языке Java, но это, вероятно, не форум, чтобы его представить ... Если кто-нибудь может предложить, где я должен его спросить (или есть ответ), я хотел бы услышать об этом. Еще раз спасибо всем вам.

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