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