如何以某种方式实例化部分实现接口的类

问题描述:

假设我有一个接口IBird。它有很多方法,如eat(),walk(),run()fly()如何以某种方式实例化部分实现接口的类

如果基类Ostrich想实施IBird,那该怎么办呢?因为Ostrich不能飞,但可以在IBird中做所有其他的东西。

+2

你的类必须实现整个接口。没有选择。如果有人试图制作“鸵鸟”飞行,那么你可以做的最接近的是抛出异常。但那会被认为是不好的做法。并可能导致意外崩溃。 – litelite

+0

程序员的主要沟通是代码,而不是故事 –

+0

你从C#书籍/博客?用'I'开始接口对于java来说并不常见。 – Oleg

您可以制作Ostrichabstract。这可能在某些情况下工作,但不在这里,因为Ostrich的每个实例都必须实现缺少的功能。

Johny指出的另一种选择是抛出UnsupportedOperationException。但是这可能会导致意外的崩溃,这对用户不利。

的第三种方法是从界面IBird去除方法fly()只留下东西,所有鸟类共享。然后,您制作另一个接口IBirdThatCanFly,其延伸IBird。然后你可以添加缺少的fly()方法。

public interface IBird { //all birds 
    public void eat(); 
    public void walk(); 
    public void run(); 
} 

public interface IBirdThatCanFly extends IBird { //birds that can fly 
    public void fly(); 
} 

public class Ostrich implements IBird { //Ostrich can't fly 
    public void eat() { ... } 
    public void walk() { ... } 
    public void run() { ... } 
} 
+0

太棒了!只是一个编辑 - 不应该鸵鸟实施IBird? – nit710

+0

当然可以:) – Professor901

你可以把UnsupportedOperationException中的 的方法扔在鸵鸟类中。

class Ostrich { 

    void fly() { 
     throw new UnsupportedOperationException(); // throws the UnsupportedOperationException if someone tries to call this method 
    } 

    // implementation of eat(), walk() and run() 

} 

如果您使用的是Java 8,则还可以在界面中使用default关键字。这将允许你写出一个方法用于类没有实现方法的事件。

+2

如果你这样做,你可以结束飞行鸵鸟。 – Oleg

+0

这只是一个解决方法,所以OP不必将该方法放在类中。我从来没有说过这是一个很好的解决方法,只是一个选择。 – dblanken

如果所有的鸟不能飞,fly()可能不应该在Bird声明。
您可以引入两个界面来区分鸟类和飞翔的鸟类。

A Bird接口说明eat(), walk(), run()方法。
A FlyingBird接口扩展Bird并声明fly()方法。

public interface Bird { 
    void eat(); 
    void walk(); 
    void run(); 
} 

public interface FlyingBird extends Bird { 
    void fly(); 
} 

public class Ostrich implements Bird { 
    public void eat(){ 
     ... 
    } 
    public void walk(){ 
     ... 
    } 
    public void run(){ 
     ... 
    } 
}