2016-09-25 62 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); 

    } 
} 
相关问题