Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 限制由少数子类重写的类方法_Java - Fatal编程技术网

Java 限制由少数子类重写的类方法

Java 限制由少数子类重写的类方法,java,Java,我在一次面试中问了一个问题 class Birds { public void fly(); public void eat(); public void sleep(); } Have several other classes extending it like - Sparrow extends Birds{ overriding fly();// Sparrow can have its own style to fly overriding

我在一次面试中问了一个问题

class Birds {
     public void fly();
     public void eat();
     public void sleep();
}

Have several other classes extending it like -

Sparrow extends Birds{
   overriding fly();// Sparrow can have its own style to fly
   overriding eat();
   overriding sleep();
}

Eagle extends Birds{
   overriding fly();// Eagle can have its own style to fly

}

Ostrich extends Birds {
    overriding fly();// Ostrich could not fly !!!
}
我怎样才能限制这种情况??因为父类在这里不知道它的子类。 Birds类由几个类扩展,有些类可以覆盖,有些类不能覆盖。

您需要使用组合:

  • 定义一个名为
    Flyable
    接口,该接口具有
    fly()
    方法
    Sparrow
    Eagle
    实现该接口<代码>鸵鸟
    没有

  • 定义一个名为
    Living
    的接口,比如说它有
    eat()
    sleep()
    方法。所有类型都实现该接口

  • 你可以向面试官指出,你可以拥有一个
    Aeroplane()
    对象,该对象实现
    可飞行
    ,但不实现
    生活


  • 您可以简单地添加FlyingBirdGroundBird类,并将它们抽象化

    public class Birds {
        public void eat() {
            // default implementation
        }
        public void sleep() {
            // default implementation
        }
    }
    
    abstract class FlyingBird extends Birds {
        public abstract void fly();
    }
    
    abstract class GroundBird extends Birds {
        public abstract void walk();
    }
    
    class Sparrow extends FlyingBird {
        @Override
        public void eat() {
            // different implementation
        }
        @Override
        public void sleep() {
            // different implementation
        }
        @Override
        public void fly() {
            // some impl
        }
    }
    
    class Eagle extends FlyingBird {
        @Override
        public void fly() {
            // some impl
        }
    }
    
    class Ostrich extends GroundBird {
        @Override
        public void walk() {
            // walk implementation
        }
    }
    

    考虑策略工厂模式“如果你把一个方法声明为‘最终’,没有一个类可以重写它。同样的是我的答案使用界面,但是面试官问:“只使用课堂回答,界面很好,这样你可以做你能为班级做些什么?”所以还有其他的解决方法,对吗?您可以使用抽象类和
    final
    。但这不太好。非常感谢你们大家。