2015-04-26 56 views
2

我真的不知道怎麼說這個問題,所以我會試着用一個例子來解釋它。在不同的類中實現相同的方法

比方說,我有三個GUI類:

  1. 基面類
  2. 詳細的表面類
  3. Sprite類

他們都是相互獨立的,中間沒有繼承他們。 現在我有一個函數「drag()」,它可以讓surface/sprite變成可拖拽的,我想把這個函數作爲它們三個的方法來實現。

因爲它是所有實現完全相同的代碼,所以我覺得它很煩人,笨重和糟糕的做法來重寫代碼。 我到目前爲止唯一想到的就是爲它製作一個安全類,並繼承這個類。但是,這似乎也不是要走的路。

我會非常感謝一些建議。

EDIT

具有稍微不同的設置另一個例子 - 我有以下類:

  1. BaseSurface
  2. Dragable
  3. 可調整
  4. 事件處理器

只有第一個是獨立的,其他的依賴於第一個(必須被繼承)。 最終用戶應該毫不費力地選擇一個簡單的BaseSurface,一個用於實現可拖動,一個用可調整大小,一個用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 
相關問題