2015-04-30 52 views
2

我有兩個問題:首先,如何使用Python創建FlyBehavior interface?其次,如何使用Python(見下文)在FlyWithWings類中的FlyBehavior接口?我正在學習用深入淺出設計模式,我想用Python使用Python創建和實現接口?

public abstract class Duck { 

    // Reference variables for the 
    // behavior interface types 
    FlyBehavior flyBehavior; 
    QuackBehavior quackBehavior; 

    public Duck() { 
    } 

    // Delegate to the behavior class 
    public void performFly(){ 
     flyBehavior.fly(); 
    } 

    // Delegate to the behavior class 
    public void performQuack(){ 
     quackBehavior.quack(); 
    } 
} 

這裏改寫以下的Java類的所有飛行的行爲類實現

public interface FlyBehavior { 
    public void fly(); 
} 

這裏的接口是飛行的行爲實施爲鴨子做飛

public class FlyWithWings implements FlyBehavior { 
    public void fly(){ 
    System.out.println("I'm flying"); 
    } 
} 

這是我迄今爲止使用Python。下面是我的Python抽象鴨類

import abc 

class Duck: 
    __metaclass__=abc.ABCMeta 


    FlyBehavior FlyBehavior; 
    QuackBehavior QuackBehavior; 

    @abc.abstractmethod 
    def __init__(): 
     return 

    @abc.abstractmethod 
    def performFly(): 
     return 

    @abc.abstractmethod 
    def performQuack(): 
     return 

這裏是我被困在試圖創建接口,並試圖實現接口。

+1

什麼是'abc'? – immibis

+0

@immibis抽象基類,我在這個鏈接閱讀了這個:https://docs.python.org/2/library/abc.html – Sparky

回答

4

亞歷克斯·泰勒指出,Python是一種鴨子類型的語言 - 你不需要指定類型的東西,你只需要使用它們。

但是,我認爲他翻譯的Java代碼是錯誤的。你不需要在這裏使用abc - 只需使用普通的課程。

class Duck(object): 
    # Like in Java, you don't need to write a __init__ if it's empty 

    # You don't need to declare fields either - just use them. 

    def performFly(self): 
     self.flyBehaviour.fly() 

    def performQuack(self): 
     self.quackBehaviour.quack() 

class FlyWithWings(object): 
    def fly(self): 
     print "I'm flying" 

# Example: 
d = Duck() 
d.flyBehaviour = FlyWithWings() 
d.performFly() # prints "I'm flying" 
+0

不應該最後一行是:'d.performFly()'? – twk

+0

@twk固定..... – immibis

3

Python是duck typed語言。你不需要接口 - 你傳入一個對象,並且它支持你想要的方法。如果它沒有這種方法爆炸。它沒有Java的編譯時檢查。如果你需要檢查,你可以在運行時自己做。因此,它應該僅僅是:

import abc 

class Duck: 
    __metaclass__=abc.ABCMeta 


    FlyBehavior FlyBehavior; 
    QuackBehavior QuackBehavior; 

    @abc.abstractmethod 
    def __init__(): 
     return 

    @abc.abstractmethod 
    def performFly(): 
     flyBehavior.fly() 

    @abc.abstractmethod 
    def performQuack(): 
     quackBehavior.quack() 

作爲一個更廣泛的觀點,並不是所有的設計模式適用於所有語言。見Are Design Patterns Missing Language Features

+1

關於設計模式不適用於所有語言的好處。 – immibis