2011-07-11 1 views
0

私はSHAPEという名前のインターフェイスを持っています。 CIRCLEおよびRECTANGLEは、このインターフェイスを実装する2つのクラスです。今私はCIRCLERECTANGLEのプロパティを拡張するクラス(私はクラスを書くためのオプションがあります)を書く必要がありますCIRCULARRECTANGLE。どのようにJavaでこれを行うには?Javaでこの次の構造をどのように設計するのですか?

+2

Javaはできない(我々が円と長方形インタフェース及び具体的な実装を持っている、と仮定して)アダプタパターンの使用を検討することができ円を四角にする。 –

+0

@Andreas_D私は同意します100% –

+0

ここでは一般的な方法は 'area()'だと思います。 :-) –

答えて

2

Javaは一度に1つのクラスを拡張するため、基準に合わせて抽象クラスを作成する必要があります。

例:

public abstract class AbstractRectangle extends Rectangle { 

public abstract class AbstractCircularRectangle extends AbstractRectangle { 

public class CircularRectangle extends AbstractCircularRectangle { 

更新:決して仕事私の最初の試みは、意志、それゆえ私の更新:

私の最初の試みCircleを延長したことがないので、あなたは意志参照先をCircleまたはRectangleにしておく必要があります。

public class CircularRectangle extends Rectangle { 

    private Circle circle; 

    public CircularRectangle(Circle circle) { 
     this.circle = circle; 
    } 

    // Some logic: 
} 

コンストラクタの目的は、円を参照することです。

+0

しかし、あなたはサークルを拡張していません! – THelper

+0

ああ、ありがとう....アップデート中。 –

3

これは直接行うことはできません。 Javaクラスは、常に1つのクラスだけを拡張できます。

でも同様の効果を得るために使用します。あなたのCircularRectangle(それが表すものであれば何でも構いません)参照CircleRectangleオブジェクトがあり、それ自体のプロパティを「現在」持っています。

+0

質問はあいまいです。あなたは 'SHAPE'がどのように見えるのか分かりません –

+0

@Op:これが有用かどうかについて私はこれ以上コメントしませんでした。 –

0

javaは複数の継承を許可しないため、これは不可能です。クラスに複数のスーパークラスを継承させることはできません。 継承の代わりに合成を使用してみてください。

2

Javaはおそらくあなたが組成物を使用して行うことができ、multiinheritanceを許可しない:

CIRCULARRECTANGLESHAPEを実装しています。

CIRCULARRECTANGLEはまた、あなたのロジックに従って、この2つのインスタンスを使用してCIRCULARRECTANGLEのメソッドを実装.Then CIRCLERECTANGLEのインスタンスが含まれています。

1

2つのインタフェースCircleとRectangleを定義します。クラスはこれらのインターフェイスを実装します。次に、両方のインタフェースを拡張したインタフェースCircularRectangleを定義することができます。 tridrクラスCircularRectangleは、2つのインスタンスcirlceInstanceとrectangleInstanceを持ち、インスタンスから必要なメソッドを呼び出す呼び出しを委譲する必要があります。

3

が-Circleであり、両方のエンティティがクラスである限り、Rectangleであるクラスを定義することはできません。統合失調症の挙動のこの種類は、所望される問題を解決するために

は、我々は

public class CircleImpl implements Circle { 

    // fields, constructors, implemented Circle methods 

public Object adapt(Class<? extends Shape> adaptee) { 

    if (adaptee == Rectangle.class) { 
    return new Rectangle() { 
     // implemented rectangle methods so that 
     // we have a squared circle 
    }; 
    } 
    return null; 
} 
} 
+0

+1は 'CircularRectangle'が' Cirle'でも 'Rectangle'でもないことを指摘していますので、どちらも拡張しないでください - 共通の継承誤解。 – Qwerky

関連する問題