Статическая и динамическая композиции в c++
Возможность метапрограммирования в c++ позволяет расширить тривиальные способы композиции классов, варьируя сцепленность и зависимость объектов.
Ниже приведены пять вариантов композиции в c++.
- Жёсткая композиция:
(-) сильная зависимость
class A
{
public:
void doSmthing(){
b.method();
}
private:
B b;
};
class A protected B
{
public:
void doSmthing(){
this->method();
}
};
- Динамическая композиция:
- (o) слабая зависимость
- (-) развязано только до уровня AbstractB
class A
{
public:
A(AbstractB *b) : b(b) {};
void doSmthing(){
b->method();
}
private:
AbstractB* b;
};
- Статическая композиция:
- (+) минимальная зависимость
- (-) невозможна динамическая смена композанта, низкая сцепленность
template <class B>
class A
{
public:
void doSmthing(){
b.method();
}
private:
B b;
};
template <class B>
class A : protected B
{
public:
void doSmthing(){
b.method();
}
};
- Статическая композиция с динамической инициализацией.
- (+) минимальная зависимость
- (+) возможна динамическая смена композанта, высокая сцепленность
- (-)
class A
меняет тип в зависимости от композиции
template <class B>
class A
{
public:
A(B* b) : b(b){};
void doSmthing(){
b->method();
}
private:
B* b;
};
- Статическая композиция с динамической инициализацией и абстрактным предком.
- (+) минимальная зависимость
- (+) возможна динамическая смена композанта, высокая сцепленность
- (+) class A предоставляет постоянный интерфейс AbstractA
class AbstractA
{
public:
void doSmthing() = 0;
};
template <class B>
class A : public AbstractA
{
public:
A(B* b) : b(b){};
void doSmthing(){
b->method();
}
private:
B* b;
};