【问题标题】:Can an extended class not inherit a method?扩展类不能继承方法吗?
【发布时间】:2012-09-03 16:22:16
【问题描述】:

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

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

【问题讨论】:

  • 覆盖 penguin 类中的 fly() 并使其抛出“I'm a Brick”异常?
  • 我认为你需要有另一个类子集(另一个分类级别),你的设计需要改变。无论您提出什么要求,都无法立即完成。

标签: java class inheritance overriding


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你不能。但是,你可以在企鹅的fly() 方法中抛出一个UnsupportedOperationException

    【讨论】:

    • 你应该使用 UnsupportedOperationException
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      重写 fly 方法以指向另一个动作或返回而不执行该动作。

      【讨论】:

        【解决方案5】:

        不可以

        你能得到的最接近的方法是重写方法并抛出

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

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

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

        【讨论】:

        • 感谢您的回复。我曾考虑过进一步细分课程,如果有更简单的方法,这似乎很麻烦。看来我该学习如何抛出异常了。
        • @MrDetail UnsupportedOperationException 是运行时异常。查看已检查和未检查异常之间的区别。它可能会在很大程度上影响您的代码
        • @RNJ 通过UnsuportedOperationException,我们需要覆盖NonFlyableBirds 上的fly()。根据@MrDetail 的问题,他希望确保企鹅对象不能调用fly() 方法。但设计建议调用 fly 并抛出 UnsuportedOperationException。我认为还需要为 NonFlyableBirds 调用 fly 然后编写一些逻辑来避免飞行行为。
        • @PrasadSDeshpande 为什么在 NonFlyableBirds 中有 fly()?它不在那里,您不需要任何逻辑来避免飞行行为
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            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();
            }
            }
            

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 2017-03-16
                • 2010-11-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多