2016-03-31 9 views
0

PointAreaクラスは、C#がどのようにPointSizeを持っているかと似ています。あなたが見ることができるように他のwidth, heightを持っていながら、1はx, yを持っている以外、2つのクラスが、正確な重複しているAreaとPointの共通基本クラスはどのように実装すればいいですか?

class Point: 
    def __init__(self, x=0, y=0): 
     self.x = x 
     self.y = y 

    def __add__(self, other): 
     return Point(self.x + other.x, self.y + other.y) 

    # Many other magic methods too! 


class Area: 
    def __init__(self, width=0, height=0): 
     self.width = width 
     self.height = height 

    def __add__(self, other): 
     return Area(self.width + other.width, self.height + other.height) 

    # Many other magic methods too! 

:ここでは、2つのクラスの簡単な実装があります。

これらの2種類の基本クラスを実装するための良い解決策は何でしょうか?

+0

@Lucian「あなたが見ることができるように、他のは '幅、height'を有している1は、' X、y'を持っている以外、2つのクラスが、正確な複製である。」おそらく*ので、 *ベースクラスは複数のクラスで重複したコードを取り除きます。それが最善の解決策であると言っているわけではありませんが、** a **解決策です。 –

+1

それぞれは2つのパラメータを必要としますが、必ずしも共通の親クラスを正当化するのに十分な関係にはありません。 – TigerhawkT3

+0

@ TigerhawkT3 2つの属性の異なる名前のみ... ... –

答えて

1

あなたは不変オブジェクトを使用して気にしない場合は、2次元のもののすべての基本クラスをcraeteするtupleをサブクラス化することができます:

class _2dTuple(tuple): 

    def __new__(cls, hor=0, ver=0): 
     super().__new__(cls, (hor, ver)) 

    def __add__(self, other): 
     return type(self)(self[0] + other[0], self[1] + other[1]) 

あなた_2dTupleをサブクラス化する場合さて、あなただけのpropertyを作成することができますあなたのx, ywidth, heightのgetter:

class Point(_2dTuple): 

    @property 
    def x(self): 
     return self[0] 

    @property 
    def y(self): 
     return self[1] 


class Area(_2dTuple): 

    @property 
    def width(self): 
     return self[0] 

    @property 
    def height(self): 
     return self[1] 
+0

私は数学者ではありませんが、ポイントは "2次元のもの"ですか?彼らはどんな次元構造でも存在することができますが、それ自体が「サイズ」を持っていません。また、あなたのソリューションは両方のオブジェクトに親クラスを与えますが、明確な内部変数( 'self.width'など)をあまり明確でないもの(例:' self [0] ')に置き換えて処理します。標準の3(長さ、幅、高さ)を超えるディメンションの名前はないので、これをn次元のオブジェクトに拡張すると理にかなっていますが、2Dオブジェクトの場合は、通常の命名規則が望ましいと思います。 – TigerhawkT3

+0

答えをありがとう、私はまだ誰かがより良いものを見つける場合、受け入れる前に、より多くの答えを待つだろう! :) –

+0

@ TigerhawkT3あなたが正しいです、それは "stuff"をどう定義するかによって決まります。それは私からのむしろあいまいな言葉です。そして、明らかに、 'width'や' height'のような明確な名前がインデックスを介して変数にアクセスする方が良いですが、私たちはtupleをサブクラス化する '2dTuple'というクラスに入っているので、インデックス' 0'と「1」は、書かれたときに美しくないとしても、理解するには複雑すぎる。 OPの質問は、異なるクラスの属性の名前が異なるため、値を名前にバインドしないようにしています。 –

関連する問題