Можно ли использовать миксины для реализации абстрактных методов? - PullRequest
0 голосов
/ 23 сентября 2018

Я выполняю рефакторинг некоторого кода, который не очень многократно используется и содержит довольно много повторяющегося кода.В коде есть два класса A и B, которые расширяют абстрактный класс I. Но есть подклассы A и B для поддержки концепций X и Y, поэтому результатом являются конкретные классы AX, AY, BX, BY с понятиями X и Y, которые копируются и вставляются.в каждый.

Итак, я знаю, что могу использовать композицию здесь для делегирования поддержки функций X и Y, но для этого также требуется код, который создает эти объекты и т. д. Именно поэтому я начал читать о миксинах, поэтому мне интересно,мой код - хорошее решение

class I(ABC):
    @abstractmethod
    def doSomething():
        pass

class ICommon(ABC):
    @abstractmethod
    def doSomethingCommon():
        pass

class A(I, ICommon): 
    # the interface(s) illustrates what mixins are supported 
    # class B could be similar, but not necessarily with the same interfaces
    def doSomething():
        self.doSomethingCommon()
        ...

class XCommonMixin(object): 
    # feature X shared possibly in A and B
    # I have also split features X into much smaller concise parts, 
    # so the could be a few of these mixins to implement the different 
    # features of X
    def doSomethingCommon():
        return 42

class AX(XCommonMixin, A):
    pass 
    # init can be defined to construct A and bases if any as appropriate

1 Ответ

0 голосов
/ 23 сентября 2018

Да, это как раз то, для чего существуют миксины (или, в более общем смысле, классы).Предполагается, что класс инкапсулирует все функции, связанные с определенной концепцией или целью (например, ваши A и B, но также как ваши X и Y).

Я верю вам 'переосмыслить это.Вы, вероятно, знаете, как использовать классы, а миксины - это на самом деле просто классы, которым дано причудливое имя, потому что для их работы требуется множественное наследование.(Поскольку миксины не всегда являются законченными классами, способными функционировать сами по себе; они представляют собой набор функций, которые можно присоединить к другим классам.) Классы посвящены разделению задач.Одна проблема - один класс.Реализуйте класс для каждого из 4 понятий A, B, X и Y, а затем объедините их (с множественным наследованием), как считаете нужным.

Я настоятельно рекомендую прочитать Что такое миксин и почему они полезны? .(Текущий) ответ с наивысшим рейтингом хорошо объясняет, что миксины существуют именно для таких ситуаций.

...