Другое решение, которое могло бы работать, следующее:
Предположим, что базовый класс называется MyBaseClass, дочерние классы - от ChildClass1 до ChildClass5, а функция, которую вы хотите дублировать, выглядит следующим образом:
public int foo(Object args)
{...}
Теперь вы можете создать отдельный класс (назовите его «HelperFunctions» или что-то в этом роде) с помощью статического метода:
public static int fooHelper(BaseClass theClass, Object args)
{insert duplicated code here}
и затем используйте функции foo в классах, которые вы хотите вызвать этой вспомогательной функцией.
Это имеет несколько преимуществ:
- Вы не создаете новые объекты и не меняете иерархию типов. Поскольку вспомогательная функция является статической, вы можете вызывать ее, не добавляя новых объектов.
- Вы по-прежнему можете вызывать методы класса, потому что вы передаете объект типа BaseClass, поэтому вы можете вызывать методы для него так же, как и внутри класса.
Большинство ответов выше говорят об использовании нового класса, но метод, который я использую, вызывает многие другие методы класса, а также использует некоторые переменные экземпляра класса. Если я использую миксин или создаю новый класс, я не смогу реализовать метод.
Я не уверен, что понимаю, в чем проблема. По крайней мере, в моем решении вы передаете объект, так что вы можете вызывать любые методы и обращаться к переменным экземпляра для объекта, который вы хотите. Проблема в том, что переменные экземпляра или методы, к которым вы хотите получить доступ, являются закрытыми, поэтому вы не можете получить к ним доступ вне класса? В этом случае вы можете легко решить эту проблему, объявив вспомогательную функцию дружественной функцией (просто ознакомьтесь с руководствами по использованию функции "c ++ friend" в Google)