我的问题是:我可以创建一个扩展另一个类的类,但是选择不继承特定的方法吗?
一个简单的例子,我有一个带有一个方法的抽象Bird类fly()。我想为不同种类的鸟类创造课程,但企鹅不能飞翔。如何确保企鹅对象无法调用fly()方法?
答案 0 :(得分:9)
不,你不能
最接近的是覆盖方法并抛出
@Override
public void fly() {
throw new UnsuportedOperationException();
}
Java API有时会这样做,但我个人认为这是一个糟糕的设计。
你可以做的是拥有Bird的层次结构和两个子类FlyableBird和NonFlyableBird然后让Penguin挂起NonFlyableBird。 fly方法只能在FlyableBird类中。鸟类仍然可以包含像makeNoise()(所有鸟类都不发出噪音的东西吗?)这些都是FlyableBird和NonFlyableBird共同的
答案 1 :(得分:3)
不,你不能,这将从根本上打破多态性。您必须实现该功能并执行诸如抛出异常或不执行任何操作之类的操作。
答案 2 :(得分:2)
你做不到。但是,您可以在企鹅的UnsupportedOperationException
方法中抛出fly()
。
答案 3 :(得分:2)
您需要有非常好的设计来实现您提到的场景。你需要有如下设计。
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();
}
}
答案 4 :(得分:1)
如果您需要执行您想要执行的操作,则您的类/概念层次结构错误。重新设计你的课程。
答案 5 :(得分:0)
覆盖fly方法以指向另一个操作或返回而不执行该操作。
答案 6 :(得分:0)
您可以将方法Fly声明为abstract method,但如果您不提供实现,您将被迫将Penguin类声明为抽象,我认为这不是您正在寻找的因为企鹅不应该是抽象的,所以没有任何意义。
答案 7 :(得分:0)
您可以创建一个名为Fly的界面。然后扩展Bird的每个具体类都可以实现这个接口。 Penguin不会实现这一点,所以你的企鹅对象引用永远不会飞。
答案 8 :(得分:0)
我认为,您可以使用fly,walk等抽象方法创建一个主要的抽象类Bird。 然后你可以创建那个Bird类的两个子类。 FlyingBirds和NonFlyingBird。在非飞鸟的具体类中,你可以将fly方法作为final。所以这个方法不会继承到子类。