У меня два класса класс А а также класс B. я хочу класс B иметь функциональность класс А плюс еще немного собственной функциональности. Один из очень простых способов сделать это — наследовать класс B от класс А. Но я не могу сделать это по некоторым причинам, связанным с реализацией.
Я подумал о другом решении, где я создам еще один класс класс С который будет содержать все виртуальные функции. классы А и В унаследует от класс С. класс А будет содержать реализацию виртуальных функций и класс B может также определить тот же набор функций и, следовательно, класс B будет иметь функциональность класс А.
Это оптимальное решение? Есть ли лучшие решения, чем это, кроме прямого наследования класс B от класс А?
То, что вы ищете, называется Состав (по наследству).
Композиция над наследованием (или принципом составного повторного использования) в
объектно-ориентированное программирование — это метод, с помощью которого классы могут
добиться полиморфного поведения и повторного использования кода, содержащий другие
классы, которые реализуют желаемую функциональность, а не через
наследование.
Это означает, что вместо того, чтобы иметь class B
наследовать от class A
, вы можете иметь class B
содержать экземпляр class A
, Это тоже хорошая практика кодирования чтобы избежать жесткой связи между class A
а также class B
,
Вы можете сделать это, однако, если вы создаете class C
чтобы быть абстрактным базовым классом и наследовать от него класс A и класс B, тогда вы понимаете, что class A
а также class B
будет не связано, за исключением того факта, что они наследуются от одного и того же абстрактного базового класса. Это означает, что вы не сможете разыгрывать class B
в A
и т. д. В общем случае такая реализация зависит от вариантов использования.
Например.:
Ваш class C
является Person
, class A
является Teacher
а также class B
является Student
, Тогда ученик не учитель, а учитель не ученик, поэтому такая реализация является действительной.
Вы можете использовать прокси-классы, создав два других класса PA
а также PB
где PB
наследуется PA
, Эти прокси-классы дублируют интерфейс из A
а также B
соответственно, но на самом деле не воплощать в жизнь их. Вместо этого они просто вызывают функции в экземпляре A
а также B
,
Класс A будет содержать реализацию виртуальных функций, а класс B также может определять тот же набор функций.
Таким образом, у вас будет дублирование кода, и это не очень хорошая вещь.
Если вы не хотите использовать наследование, попробуйте композицию.
Я объяснил состав ранее Вот.