Использование наследования против раскрытия метода члена композиции через std :: function - PullRequest
2 голосов
/ 13 марта 2019

Я создаю 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_))
{
}

}

Не могли бы вы поделиться своими мыслями по этому поводу?У меня нет опыта работы с большими проектами программного обеспечения, поэтому я изо всех сил пытаюсь начать по правильному пути.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...