Я создаю API, в котором МНОГИЕ объекты имеют МНОЖЕЕ функциональных возможностей.
Мой основной инстинкт - использовать наследование, однако они не строго придерживаются отношения типа "is-a" - это только "функциональные возможности"которые являются общими.Например, это не отношения типа «двигатель-> турбо-двигатель», «двигатель-> горение-двигатель».Грубо говоря, это в большей степени бренд -> автомобиль, бренд -> самолет.
Наследование удобно, потому что фирменный объект обладает полезными функциями, такими как название компании и т. Д., Которые полезны во многих классах.Наследование позволяет легко выявлять функции класса бренда.Тем не менее, я боюсь использовать наследование, так как это сделало бы все сильно связанными.Вероятно, это приведет к хрупким проблемам базового класса в будущем.
Моя проблема с композицией заключается в том, чтобы вручную писать МНОГИЕ функции-обертки для раскрытия открытых методов класса бренда в приведенном выше примере (это действительная проблема?).Чтобы упростить представление функциональности, я использовал std :: function и std :: bind.
Ниже приведен фиктивный код, показывающий мои подходы.
С наследованием (при таком подходе я быприходится делать несколько наследований)
Class Identity //Stores name, id and has functions such as Get/SetName, Get/SetId, etc.
Class TypeA : Public Identity
Class TypeB: Public Identity
...
Мое решение с композицией (чтобы не копировать код / писать функции-оболочки):
Class Identity
{
int GetId(){}
}
Class TyepA
{
Identity identity_;
std::function<int(void)> GetId;
TypeA():
GetId(std::bind(&Identity::GetId, &identity_))
{
}
}
Не могли бы вы поделиться своими мыслями по этому поводу?У меня нет опыта работы с большими проектами программного обеспечения, поэтому я изо всех сил пытаюсь начать по правильному пути.
Спасибо!