2016-09-25 66 views
3

我正在使用接口來處理一個簡單的項目,但是我遇到了讓我的類符合接口的問題。在類中實現接口方法時出錯

我的思考過程是,由於Article實現了IDedObject,因此我應該能夠在我的文章類定義中的重寫函數中傳遞一篇文章作爲參數。不幸的是,這將引發錯誤 「文章類型必須實現繼承的抽象方法IDedObject.getID()」

接口

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(Article article){ 
    return article.articleID; 
} 

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

什麼丟失或不正確?

+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

我最初是這樣設計的,但是在我的Article類中有一個錯誤「類型文章必須實現繼承的抽象方法IDedObject.getID()」,這對我來說意味着我不能將參數傳遞到功能,對嗎? – zomp

+0

這是如何回答這個問題的? – CKing

+0

@CKing:看編輯。 –

0

您的覆蓋

public int getID(Article article) 

不會覆蓋接口的方法,因爲在參數不匹配的 - 它應該是IDedObject。 您可以使用IDedObject的通用參數,並使用通配符約束來確保它實現IDedObject,但據我所知,無法告訴Java您要繼承與通配符相同的類型。

2

getIDputID方法並不被Article類重寫。他們正在超載

當您更改參數類型,它是一個超載而不是覆蓋。這看起來有點令人困惑,但要理解的關鍵是Article從接口繼承了兩種方法。當你改變參數類型時,你實際上是重載這些繼承的方法而不是重載他們。

也就是說,getter方法的目的是返回實例變量的值,並在返回該值之前對該值執行一些操作。

+0

所以一個getter方法需要一個參數?這根本不符合邏輯。 –

+0

我只回答被問到的直接問題*我的思考過程是因爲Article實現了IDedObject,所以我應該能夠在我的文章類定義中的重寫函數中傳遞一篇文章作爲參數。不幸的是,這會引發錯誤「類型文章必須實現繼承的抽象方法IDedObject.getID()* – CKing

+0

最好的解決方案可能是回答這兩個問題,直接問題和XY問題。 –

-1

您需要轉換爲接口(Article)的實現。接口和類中的方法簽名需要相同。

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); 

    } 
} 
相關問題