如何以某种方式实例化部分实现接口的类
假设我有一个接口IBird
。它有很多方法,如eat()
,walk()
,run()
和fly()
。如何以某种方式实例化部分实现接口的类
如果基类Ostrich
想实施IBird
,那该怎么办呢?因为Ostrich
不能飞,但可以在IBird
中做所有其他的东西。
您可以制作Ostrich
abstract
。这可能在某些情况下工作,但不在这里,因为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() { ... }
}
太棒了!只是一个编辑 - 不应该鸵鸟实施IBird? – nit710
当然可以:) – 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()
}
如果所有的鸟不能飞,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(){
...
}
}
你的类必须实现整个接口。没有选择。如果有人试图制作“鸵鸟”飞行,那么你可以做的最接近的是抛出异常。但那会被认为是不好的做法。并可能导致意外崩溃。 – litelite
程序员的主要沟通是代码,而不是故事 –
你从C#书籍/博客?用'I'开始接口对于java来说并不常见。 – Oleg