2015-04-26 1 views
2

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

Скажем, у меня есть три GUI класса:

  1. Базовый класс Поверхность
  2. Подробное Класс поверхности
  3. Sprite Класс

Все они независимы друг от друга, нет наследования среди их. Теперь у меня есть функция drag(), которая позволяет перемещать поверхность/спрайт, и я хочу реализовать эту функцию как метод для всех трех из них.

Поскольку это тот же самый код для всех реализаций, я нахожу это раздражающей, громоздкой и плохой практикой, чтобы переписать код. Единственное, что я придумал до сих пор, это сделать для него класс saperate и наследовать этот класс. Но это тоже не похоже.

Я бы очень благодарен за совет.

EDIT

Другой пример с несколько иной настройки - У меня есть следующие классы:

  1. BaseSurface
  2. Dragable
  3. Resizable
  4. EventHandler

Только первый независим, другие зависят от первого (должны быть унаследованы). Конечный пользователь должен, без каких-либо усилий, иметь возможность выбирать между простым BaseSurface, один с которым реализует dragable, один с возможностью изменения размера, один с eventHandler и любую комбинацию. «Без каких-либо усилий» я подразумеваю, что конечный пользователь не должен создавать собственный пользовательский класс и наследовать нужные классы, а также вызывать соответствующие методы (init, update, ...), которые разделяют некоторые классы.

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

+2

Сделать родительский класс и унаследовать от него три класса - это именно то, что нужно сделать. Это предназначенное использование классов. – TigerhawkT3

ответ

1

Это именно тот случай, когда вы должны использовать родительский класс. В обоих случаях это выглядит как ваш родительский класс (логически) должно быть что-то вроде:

class Drawable(object): 
    def drag(self, *args, **kwargs): 
     """Drag and drop behavior""" 
     # Your code goes here 

Тогда каждый из ваших других классов наследует от этого

class BaseSurface(Drawable): 
    # stuff 

class DetailedSurface(Drawable): 
    # stuff 

class Sprite(Drawable): 
    # stuff 

Во втором случае, что у вас есть интерфейсы, так что вы можете логически сделать что-то вроде:

class DragInterface(object): 
    """Implements a `drag` method""" 
    def drag(self): 
     """Drag and drop behavior""" 
     # Your code goes here 

class ResizeInterface(object): 
    """Implements a `resize` method""" 
    def resize(self): 
     """Drag and drop resize""" 
     # Code 

class EventHandlerInterface(object): 
    """Handles events""" 
    def handle(self, evt): 
     # Code 

class MyNewSurface(BaseSurface, DragInterface, ResizeInterface): 
    """Draggable, resizeable surface""" 
    # Implement here