2016-09-25 22 views
3

私はインターフェイスを使用して簡単なプロジェクトを作成していますが、クラスをインターフェイスに適合させることに問題があります。クラス内でインターフェイスメソッドを実装する際のエラー

アーティクルがIDedObjectを実装して以来、Articleクラス定義内のオーバーライドされた関数でアーティクルをパラメータとして渡すことができるはずです。残念ながら、これが見つからないか、間違っては何

public class Article implements IDedObject{ 
private int articleID; 
private String articleName; 
private String authorName; 

@Override 
public int getID(Article article){ 
    return article.articleID; 
} 

@Override 
public void printID(Article article){ 
    System.out.println(article.articleID); 
} 
} 

インタフェース

public interface IDedObject{ 
    public int getID(IDedObject object); 
    public void printID(IDedObject object); 
} 

クラス

")タイプの記事が継承された抽象メソッドIDedObject.getIDを(実装しなければなりません" というエラーがスローされます?

+2

インターフェイス自体は意味をなさないものです。なぜそのメソッドはパラメータを取っていますか?なぜ自分のタイプの? –

+0

あなたの完全な要件を投稿してください。なぜなら、ここでは第一の原則が欠けていると思うからです。 –

+0

getIDとprintIDはIDedObjectをパラメータとして使用する必要があります。 – Kelvin

答えて

2

私たちはあなたの要件を持っていないので、推測されますが、あなたのインターフェースは壊れていると思います。変更を検討:

public interface IDedObject{ 
    public int getID(IDedObject object); 
    public void printID(IDedObject object); 
} 

に:

public interface IDedObject{ 
    public int getID(); 
    public void printID(); 
}  

次に実装は、あなたのコンパイルエラーについては

public class Article implements IDedObject{ 
    private int articleID; 
    private String articleName; 
    private String authorName; 

    // constructor and other getter and setter methods here 

    @Override 
    public int getID(){ 
     return articleID; 
    } 

    @Override 
    public void printID(){ 
     System.out.println("" + articleID); 
    } 
} 

些細なことだろう - 任意のオーバーライドされたメソッドのシグネチャはのものと一致しなければなりませんインタフェースメソッド。たとえば、リンク内のRectangleの例では、そのクラスまたはインタフェースを拡張する場合、メソッドパラメータはインタフェースで宣言されているインタフェースパラメータを取る必要があります。例えば

は、次のインターフェイスを持っていたと言う:

public interface FooInterface { 
    int getValue(); 
    void printValue(); 
    int difference(FooInterface fi); 
} 

差分法のためFooInterfaceパラメータを使用する必要があり、このインタフェースを実装した具象クラス。例えば:

class FooClass implements FooInterface { 

    private int value; 

    @Override 
    public int getValue() { 
     return this.value; 
    } 

    @Override 
    public void printValue() { 
     System.out.println(String.valueOf(value)); 
    } 

    @Override // can't use FooClass for parameter here 
    public int difference(FooInterface fi) { 
     return value - fi.getValue(); 
    } 

} 
+0

私は当初このように設計していましたが、私の記事クラスにエラーがあります。 "型のアーティクルは、継承した抽象メソッドIDedObject.getID()を実装する必要があります。機能、右? – zomp

+0

これはどのようにして質問に答えますか? – CKing

+0

@CKing:編集を参照してください。 –

0

あなたのオーバーライド

public int getID(Article article) 

があるため、パラメータの不一致のインターフェイスのメソッドをオーバーライドしない - それはIDedObjectする必要があります。 IDedObjectに汎用パラメータを使用し、ワイルドカード制約を使用してIDedObjectを実装することができますが、わかっている限り、ワイルドカードと同じタイプで継承することをJavaに伝える方法はありません。

2

getIDputID方法はArticleクラスオーバーライドされていません。彼らはにオーバーロードされていますです。

パラメータタイプを変更すると、オーバーロードであり、オーバーライドではありません。これは最初はちょっと混乱しているかもしれませんが、理解しておくべき重要なことは、Articleがインターフェイスから2つのメソッドを継承していることです。パラメータタイプを変更すると、実際にはをオーバーライドし、をオーバーライドしてこれらの継承されたメソッドをオーバーロードしています。つまり、ゲッターメソッドの目的は、インスタンス変数の値を返し、オプションとして、この値を返す前にいくつかの操作を実行することです。

+0

ゲッターメソッドにはパラメータが必要ですか?これは意味をなさない。 –

+0

私は直接質問に答えるだけです*私の考え方は、ArticleがIDedObjectを実装して以来、私はArticleクラス定義内のオーバーライドされた関数でArticleをパラメータとして渡すことができるはずです。残念ながら、これはエラーをスローします "型のアーティクルは、継承された抽象メソッドIDedObject.getID()を実装する必要があります* – CKing

+0

おそらく最も良い解決策は、直接質問とXY問題の両方に答えることです。 –

-1

インターフェイスの実装(記事)にキャストする必要があります。インタフェースのメソッドシグネチャとクラスは同じである必要があります。

public interface IDedObject{ 
    public int getID(IDedObject object); 
    public void printID(IDedObject object); 
} 

public class Article implements IDedObject{ 
    private int articleID; 
    private String articleName; 
    private String authorName; 

    @Override 
    public int getID(IDedObject object) { 
     Article article = (Article) object; 
     return article.articleID; 
    } 

    @Override 
    public void printID(IDedObject object) { 
     Article article = (Article) object; 
     System.out.println(article.articleID); 

    } 
} 
関連する問題