Создание объекта зависящего от других объектов в джава
Имеется следующая задача - нужно создать объект ёмкость в основаниях которого могут быть такие фигуры как квадрат, прямоугольник, круг и тому подобное. Емкость должна быть наклонной с одинаковыми углами наклона во всех направлениях. (Я описал не всю задачу а только тот момент который у меня вызвал вопрос). Я написал следующие классы:
public abstract class Container {
private float volume;
private Liquid liquid;
private float height;
private float weight;
}
public class InclinedContainer extends Container {
private InclinedContainerBase largeBase;
private InclinedContainerBase littleBase;
public InclinedContainer(InclinedContainerBase largeBase,
InclinedContainerBase littleBase) {
this.largeBase = largeBase;
this.littleBase = littleBase;
}
}
Я реализовал класс InclinedContainer, он состоит из двух оснований - большего и меньшего. Классы оснований написаны и имеют общий интерфейс InclinedContainerBase. И на этом этапе я столкнулся с проблемой, ведь в данном случае пользователь моих классов сможет создать ескость в которой будет верхнее основание квадрат а нижнее круг - а этого не должно быть. Мой вопрос заключается в том, как правильно реализовать что бы при создании объекта InclinedContainer в конструктор можно было передавать только объекты одного типа, если в качестве первого параметра консруктора был передан квадрат, то и в качестве второго так же должен быть передан квадрат.
Ответы (2 шт):
public class Circle extends Container {
}
public class Square extends Container {
}
public class InclinedContainer extends Container {
private Container largeBase;
private Container littleBase;
public InclinedContainer(Circle largeBase, Circle littleBase) {
this.largeBase = largeBase;
this.littleBase = littleBase;
}
public InclinedContainer(Square largeBase, Square littleBase) {
this.largeBase = largeBase;
this.littleBase = littleBase;
}
}
Сделайте InclinedContainer параметризированным типом:
public class InclinedContainer<T extends InclinedContainerBase> extends Container {
private T largeBase;
private T littleBase;
public InclinedContainer(T largeBase,
T littleBase) {
this.largeBase = largeBase;
this.littleBase = littleBase;
}
}
Тогда типы с разными базами будут отличаться:
CircleBase littleBase = ...;
CircleBase largeBase = ...;
InclindedContainer<CirleBase> cirleBaseContainer = new InclindedContainer<CirleBase>(largeBase, littleBase);
