4

我的问题是:我可以创建一个扩展另一个类的类,但选择不继承特定方法吗?

一个简单的例子,我有一个抽象的鸟类,它有一个方法,fly()。我想为不同种类的鸟类创建课程,但企鹅不会飞。如何确保企鹅对象不能调用 fly() 方法?

4

9 回答 9

11

不,你不能

你能得到的最接近的是覆盖方法并抛出

@Override
public void fly() {
    throw new UnsuportedOperationException();
}

Java API 有时会这样做,但我个人认为这是糟糕的设计。

你可以做的是有一个 Bird 的层次结构和两个子类 FlyableBird 和 NonFlyableBird,然后让 Penguin 挂断 NonFlyableBird。fly 方法将只在 FlyableBird 类中。鸟类仍然可以包含诸如 makeNoise() 之类的东西(所有鸟都会发出声音,不是吗?)这对 FlyableBird 和 NonFlyableBird 来说都是常见的

于 2012-09-10T19:01:49.730 回答
3

不,你不能,这会从根本上破坏多态性。您必须实现该功能并执行诸如抛出异常之类的操作或什么也不做。

于 2012-09-10T19:00:57.000 回答
3

你需要有很好的设计来实现你提到的场景。你需要有如下设计。

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();
}
}
于 2012-09-10T19:46:20.770 回答
2

你不能。但是,您可以UnsupportedOperationException使用企鹅的fly()方法。

于 2012-09-10T19:00:51.347 回答
1

如果您需要做您想做的事情,那么您的类/概念层次结构是错误的。重新设计你的课程。

于 2012-09-10T19:00:42.837 回答
0

覆盖 fly 方法以指向另一个操作或返回而不执行该操作。

于 2012-09-10T19:01:34.473 回答
0

您可以将 Fly 方法声明为抽象方法,但如果您不提供实现,您将被迫将 Penguin 类也声明为抽象方法,我认为这不是您要寻找的,因为 penguin 不应该抽象一点,没有任何意义。

于 2012-09-10T19:05:15.813 回答
0

您可以创建一个名为 Fly 的界面。那么每个扩展Bird 的可以飞行的具体类都应该实现这个接口。Penguin 不会实现这一点,因此您的企鹅对象引用永远不会飞。

于 2012-09-10T19:13:38.920 回答
0

我认为,您可以使用fly、walk 等抽象方法创建一个主要的抽象类Bird。然后您可以创建该Bird 类的两个子类。FlyingBirds和NonFlyingBirds。在非飞鸟的具体类中,可以将fly方法设为final。所以这个方法不会被继承到子类。

于 2015-12-17T19:30:57.443 回答