2016-04-04 9 views
1

私は現在Javaプロジェクトに取り組んでいます。抽象クラスNから継承する3つのクラス(I、H、O)があります.IとOはクラスSで記述されたプロパティを必要とし、クラスHとOはプロパティPとSの両方をインタフェースで作ることはできません。 N - > P N - > S とI - > S、O - > S とO - > P、H - > P
しかし:これは私がこのような構造を実装した場合という問題がありましたこれは多重継承を許さないのでjavaでは不可能です。 論理的な解決策は、SをNからPとPから継承させることです。しかし、これにより、Pのプロパティが必要ないという問題が発生します。この継承構造を修正する最も良い方法は?

私はこれを実装するためのきれいな方法を探しています。読んでいただきありがとうございます!

+0

' - >'はどういう意味ですか? 「実装する」または「実装する」を意味しますか? –

+0

私は "用途"として読める傾向がありますが、これは正しいですか?私は正確にあなたが "財産"の意味を知らない。私の直接のアイデアは、UsesPとUsesSのインターフェイスを持ち、PとSを使用するクラスを実装することです。 –

答えて

1

Iの関係:ここで

は、私がこれを参照する方法である "インターフェースで行うことができないの両方の特性PとSを"。

あなたは、フィールドの値を取得する必要がある場合は、単にメソッドを定義は次のように、実装される:

public interface MyInterface{ 
void getPropertyOne(); 
void getPropertyTwo(); 
} 

そして、あなたはJavaインターフェースにデフォルトの方法を得ることができるJava8以来、ことを覚えておいてください、それはあなたであれば役に立つかもしれませんいくつかのサブクラスで同じ実装が必要な場合や、抽象クラスを使用して同様の動作を行うことができます。

+0

これは確かに問題のまともな解決策です。 –

3

インターフェイスの共通プロパティを抽象化しようとします。

0

PSクラスシングルトンを作成し、Composition over Inheritanceを使用する必要があるようです。他の意味では、とSからの便益を、composite collaboratorsI,OHとして利用することもできます。 Nがメソッドとフィールドの共通のセットを提供する場合に限り、抽象としてNを残します。つまり、= Nはすべてのクラスのテンプレートです。

class I extends N { 
    private S s; 

    public I(S s) { 
     this.s = s; 
    } 
} 

class O extends N { 
    private S s; 
    private P p; 

    public O(S s, P p) { 
     this.s = s; 
     this.p = p; 
    } 
} 

class H extends N { 
    private P p; 

    public H(P p) { 
     this.p = p; 
    } 
} 

interface P { 
    public String getProperty(); 
} 
interface S { 
    public String getProperty(); 
} 
関連する問題