2017-10-02 11 views
-4

Java 8では、メソッドの本文の記述を可能にする「デフォルトメソッド」が導入されました。Javaのインターフェイスから子フィールドにアクセスするには?

1つのインターフェースと2つの子クラスを作成したいとします。

public interface URL { 
    int getURL() { 
     return this.myURL; 
    } // obviously 
} 

と私はmyURLフィールドを定義したい2つのクラスで:

public class MyURL1 implements URL { 
    private String myURL = "http://test1.com"; 
} 

public class MyURL2 implements URL { 
    private String myURL = "http://test2.com"; 
} 

のgetURLによって返されるインターフェイスのURLで、私はのgetURL()メソッドを持っているしたいのですが。

Javaで可能ですか?

答えて

2

いいえ、これはJavaでは不可能です。

次の似事は抽象クラスのようになります。

abstract class UrlHolder { 
    private String url; 
    protected UrlHolder(String u) { url = u; } 
    public String getUrl() { return url; } 
} 

、その後

class UrlHolder1 extends UrlHolder { 
    public UrlHolder1() { 
     super("myurl1"); 
    } 
} 
class UrlHolder2 extends UrlHolder { 
    public UrlHolder2() { 
     super("myurl2"); 
    } 
} 
+0

しかし、それは次のスーパーが前のURL値を上書きする方法を消していないのだろうか? – paus

+0

@paus 'UrlHolder1'と' UrlHolder2'は別々のクラスですから、互いに邪魔になることはありません。それぞれのインスタンスには 'url'フィールドがあり、すべての' UrlHolder1''' url'は '' myurl1''に設定されます。非公開であるため、オブジェクトのライフサイクルにわたって変更されることはありません。 – daniu

+0

はい、UrlHolder1とUrlHolder2は別ですが、urlフィールドを持つ親抽象クラスは共通です。これが私を混乱させます。 – paus

2

あなたがそれを望む方法:

public interface URL { 
    int getURL() { 
     return this.myURL; 
    } // obviously 
} 

したがって、私はあなたが例えば、代わりに抽象クラスを使用することを検討する必要があると思う、あなたはインターフェイスでは許可されていない状態を、持っている前提としています

public abstract class URL { 

    private String myUrl; 

    public URL(String url) { 
     this.myUrl = url; 
    } 

    public String getURL() { 
     return this.myURL; 
    } // obviously 
} 

次に

public class MyURL1 implements URL { 
     public MyURL1() { 
     super("http://test1.com"); 
     } 
} 
関連する問題