Как изменить дизайн экземпляра, в котором общая функциональность (в родительском классе) гарантирует возврат экземпляров дочерних элементов? - PullRequest
0 голосов
/ 10 февраля 2019

Что касается названия, я знаю, что это по своей сути ужасный дизайн, поскольку родитель не должен ничего знать о своих детях.Тем не менее, я нахожусь в сценарии, где

  1. Все дети имеют поведение многократного использования, которое может быть получено из родительского класса,
  2. Те методы многократного использования, которые необходимы всем подклассам, гарантирует возвращение экземпляров текущих подклассов!

Мне нужно, чтобы все дочерние классы имели повторяемое поведение, но также чтобы родительский класс мог возвращать экземпляры дочерних классов, для этого потребуется полный рефакторинг,но как мне его правильно спроектировать?

Я попытался использовать здесь композицию, единственная проблема в том, что все классы должны будут объявить явный публичный API для использования общей функциональности и каждого подкласса вбудущее должно будет объявить это.

class BasePage(object):
    # Some Very Common Behaviour goes here.
    # Nothing product specific, just selenium specific 

class ProductBasePage(BasePage):
    # Reusable behaviour here for the product
    # Some of this behaviour in the parent does web-app navigation
    # which merits (quite rightly) to return instances of children
    # pages, for example (CustomersPage, DashboardPage, ProductsPage)
    # but this is clearly flawed and inheritance is not the answer?
    # but how do I keep the functionality that all subclasses need
    # without then declaring it explicitly in every one of them?

class CustomersPage(ProductBasePage):
    # Customer specific behaviour
    # Should have access the common functionality implicitly from the parent

Страница клиента и все другие страницы, которые расширяют страницу продукта, должны иметь возможность использовать множество общих функций, которые должны иметь все подклассы ProductBasePage, безимея каждый подкласс, чтобы определить, чтоповедение явно.Однако методы многократного использования возвращают экземпляры подклассов ProductBasePages, поскольку их действия гарантируют такое поведение.

Так как мне этого добиться?Я думаю, что Наследование не является ответом здесь, но тогда как мне получить возможность повторного использования общей функциональности, не объявляя ее явно в каждом классе?

Решение этой проблемы должно также избежать циклических зависимостей импорта Python.

1 Ответ

0 голосов
/ 11 февраля 2019

Просто поместите эти повторно используемые методы в отдельный класс и сделайте их static.Тогда подклассы могут вызывать эти методы неявно.

Если вы не хотите использовать статические методы, используйте простые функции.

...