我的问题是:我能创建一个继承另一个类的类,但选择不继承特定方法吗?
一个简单的例子,我有一个抽象的Bird类,有一个方法fly()。我想为不同种类的鸟创建类,但企鹅不能飞。如何确保企鹅对象不能调用fly()方法?
我的问题是:我能创建一个继承另一个类的类,但选择不继承特定方法吗?
一个简单的例子,我有一个抽象的Bird类,有一个方法fly()。我想为不同种类的鸟创建类,但企鹅不能飞。如何确保企鹅对象不能调用fly()方法?
不,你不能这样做。
最接近的方法是重写该方法并抛出异常。
@Override
public void fly() {
throw new UnsuportedOperationException();
}
Java API有时会这样做,但我个人认为这是糟糕的设计。UnsuportedOperationException
,我们需要在 NonFlyableBirds
上重写 fly()
方法。根据 @MrDetail 的问题,他想确保企鹅对象不能调用 fly()
方法。但是建议的设计会调用 fly()
并抛出 UnsuportedOperationException
。我认为需要为 NonFlyableBirds
调用 fly()
,然后编写一些逻辑来避免飞行行为。 - Prasad S Deshpande您需要有非常好的设计来实现您提到的场景。您需要像以下一样进行设计。
public abstract class Bird {
FlyBehavior flyBehavior;
public Bird(){
}
public void performFly(){
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
}
public interface FlyBehavior {
public void fly();
}
public class FlyingBirds implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I can fly");
}
}
public class NonFlyingBirds implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am not able to fly");
}
}
public class KingFisher extends Bird {
public KingFisher(){
flyBehavior = new FlyingBirds();
}
public static void main(String[] args) {
Bird bird = new KingFisher();
bird.performFly();
}
}
public class Penguins extends Bird {
public Penguins(){
flyBehavior = new NonFlyingBirds();
}
public static void main(String[] args) {
Bird bird = new Penguins();
bird.performFly();
}
}
fly()
方法中抛出一个UnsupportedOperationException
。我认为,您可以创建一个名为Bird的主抽象类,并在其中定义像fly、walk等抽象方法。 然后,您可以创建两个Bird类的子类:FlyingBirds和NonFlyingBirds。在非飞行鸟的具体类中,您可以将fly方法设置为final。这样,该方法就不会被继承到子类中。
重写fly方法,将其指向另一个操作或在不执行该操作的情况下返回。