Предположим, у нас есть абстрактный класс Element
, из которого получены классы Triangle
и Quadrilateral
.
Предположим, что эти классы используются вместе с методами интерполяции, которые зависят от формы элемента.Итак, в основном мы создаем абстрактный класс InterpolationElement
, из которого мы получаем InterpolationTriangle
и InterpolationQuadrilateral
.
Затем, чтобы включить функциональность интерполяции в классы Triangle
и Quadrilateral
, мы добавляем элемент данных const-reference в класс Element
типа InterpolationElement
, то есть:
class Element
{
public:
Element(const InterpolationElement& interp);
const InterpolationElement& getInterpolation() const;
private:
const InterpolationElement& interpolation;
};
Затем мы создаем метод (как описано Скоттом Мейерсом, Effective C ++), который создает локальный статический объект класса InterpolationTriangle
как
const InterpolationTriangle& getInterpolationTriangle()
{
static InterpolationTriangle interpolationTriangle;
return interpolationTriangle;
}
, чтобы можно было создать класс Triangle
как:
class Triangle : public Element
{
public:
Triangle() : Element( getInterpolationTriangle() ) {}
};
Вот мой вопрос: правильный ли этот подход, чтобы включить методы интерполяции в мой класс Element
?Используется ли это в профессиональных сценариях?
Я мог бы напрямую реализовать все методы интерполяции в классе Element
(как чисто виртуальные) и переопределить их в производных классах Triangle
и Quadrilateral
.Однако этот подход кажется мне громоздким, поскольку каждый раз, когда мне нужно улучшить или реализовать новые функции интерполяции, мне придется делать это на этих классах.Более того, классы становятся все больше и больше (много методов), используя этот подход.
Я хотел бы услышать от вас несколько советов и комментариев
Заранее спасибо.
Дополнительные детали:
class InterpolationElement
{
public:
InterpolationElement();
virtual double interpolationMethod1(...) = 0;
:
virtual double interpolationMethodN(...) = 0;
}
class InterpolationTriangle : public InterpolationElement
{
public:
InterpolationTriangle () {}
virtual double interpolationMethod1(...) { // interpolation for triangle }
:
virtual double interpolationMethodN(...) { // interpolation for triangle }
}
class InterpolationQuadrilateral : public InterpolationElement
{
public:
InterpolationTriangle () {}
virtual double interpolationMethod1(...) { // interpolation for quadrilateral}
:
virtual double interpolationMethod1(...) { // interpolation for quadrilateral}
}