2014-09-25 3 views
-1

Это плохая практика, и если да, то зачем возвращать экземпляры дочерних классов в качестве вывода методов экземпляра родительского класса?Родительские методы, возвращающие экземпляры дочерних классов

Например, можно следующий -

class Parent(object): 
    def __init__(self, attr): 
     self.attr = attr 

    def child(self, typ): 
     if typ == 'a': 
      return ChildA(self.attr) 
     else: 
      return ChildB(self.attr) 

class ChildA(Parent): 
    pass 

class ChildB(Parent): 
    pass 

быть хорошим дизайном?

+0

Разве это не вопрос? Нам неизвестны мнения о переполнении стека. – Veedrac

+0

Я думал, что вопросы о том, «что такое хорошая практика», относительно дизайна программного обеспечения, приемлемы. Ищите «хорошую практику» в SO, и вы найдете довольно много высоко разрешенных вопросов, даже если не всегда ясно, что есть окончательный ответ. – Bach

+0

Большинство из них находятся в «старом» переполнении стека, и большинство (должно) были закрыты. – Veedrac

ответ

1

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

Я думаю, что это действительно не очень хорошая практика. Родительские классы не должны знать о дочерних классах по ряду причин, но в первую очередь это затрудняет дальнейшее расширение модуля. Всякий раз, когда новый дочерний класс подклассифицирует родительский класс (или один из его дочерних элементов), он, вероятно, также требует обновления родительского класса. В Python он заставляет все будущие дочерние классы определяться в том же файле, чтобы избежать циклического импорта. Хотя обе эти проблемы можно обойти, это просто кажется ненужной проблемой.

Кроме того, поскольку указанный метод наследуется в дочерних классах, то, если он не переопределен, он вызывает своеобразное знакомство между классами «брат», что может быть нежелательным.

Хотя я уверен, что существуют определенные ситуации, когда для родительского класса было бы полезно знать его дочерние классы, я думаю, что в целом такие ситуации вызывают ошибку в дизайне и альтернативное решение, t следует использовать такой интроспективный подход.

Обратите внимание, что это не означает, что родительские объекты не должны знать о дочерних объектах. Дочерние объекты, как и любой другой объект, могут быть законно получены в качестве аргументов для работы в родительских методах. Родитель может даже рассматривать их как родительские объекты, поскольку дочерний объект также является родительским объектом, и это один из основных пунктов ООП.

Что касается вашего конкретного примера, это может быть достигнуто с помощью factory design pattern. Нет необходимости, чтобы создаваемые объекты были того же экземпляра, что и их создатель. Например:

class factory(object): 
    def __init__(self, attr): 
     self.attr = attr 

    def create(self, typ) 
     if typ == 'a': 
      return ChildA(self.attr) 
     else: 
      return ChildB(self.attr) 

class Parent(object): 
    def __init__(self, attr): 
     self.attr = attr 

class ChildA(Parent): 
    pass 

class ChildB(Parent): 
    pass 
Смежные вопросы