当前位置: 首页 > 面试题库 >

您可以在继承树中重新构造方法抽象吗?

徐茂材
2023-03-14
问题内容

编辑:

需要明确的一点是:设计很丑陋并不是事实。关键是,设计在那里,我不得不添加另一个子类,FlyingMotorizedVehicle如果我忘记添加的话,该子类将无法按预期工作foo(...)。所以我只是想知道是否可以将其重新定义为抽象

我现在正面临一个非常奇怪的继承情况。比方说,我有三个班,VehicleMotorizedVehicle并且FlyingMotorizedVehicle还有一堆课AirplaneHelicopter…:

public abstract class Vehicle {

    abstract Something doStuff(...);

    abstract SomethingElse doOtherStuff(...);

    abstract Foo bar(...);

}

public class MotorizedVehicle extends Vehicle {

    @Override
    Something doStuff(...) {
        return new Something();
    }

    @Override
    SomethingElse doOtherStuff(...) {
        return new SomethingElse();
    }

    @Override
    Foo bar(...) {
        return new Foo();
    }

}

public class FlyingMotorizedVehicle extends MotorizedVehicle {

    @Override
    SomethingElse doOtherStuff(...) {
        return new SomethingElse();
    }

}

public class Airplane extends FlyingMotorizedVehicle  {

    @Override
    Foo bar(...) {
        //do something different
        return new Foo();
    }

}

public class Helicopter extends FlyingMotorizedVehicle {

    @Override
    Foo bar(...) {
        //do something totally different
        return new Foo();
    }

}
[...]

Vehicle提供抽象方法的抽象类也是如此。MotorizedVehicleVehicle其方法的具体实现的子类。FlyingMotorizedVehicle还是MotorizedVehicle重写MotorizedVehicles方法子集的实现的子类。

现在有子类HelicopterAirplane并且可能还有其他一些子类,在示例中,这些子类覆盖了的具体实现MotorizedVehicle#bar(...)。我想要的是“强制”其的每个子类MotorizedVehicle都必须重写该bar(...)方法并提供其自己的实现。

是否可以FlyingMotorizedVehicle通过以下方式进行更改:

public class FlyingMotorizedVehicle extends MotorizedVehicle {

    @Override
    SomethingElse doOtherStuff(...) {
        return new SomethingElse();
    }

    abstract Foo bar(...);

}

这样我就重新定义了bar(...)as抽象方法?我的IDE并没有抱怨它,但这当然并不意味着它会真正起作用。

希望您能理解我在这里指出的内容。

提前致谢

模糊的


问题答案:

是的,您必须重新定义bar(...)as抽象方法。然后,您也必须声明public class FlyingMotorizedVehicle为抽象类

public abstract class FlyingMotorizedVehicle extends MotorizedVehicle {

    @Override
    SomethingElse doOtherStuff(...) {
        return new SomethingElse();
    }

    abstract Foo bar(...);

}


 类似资料:
  • 问题内容: 通过使用抽象类,我们可以实现与接口相同的功能,那么为什么Java不允许以下代码? 我知道可以通过仅使用接口来实现多重继承,但是上面的代码与接口所做的事情相同。 问题答案: 不允许这样做,因为您可以对抽象类做更多的事情。允许多重继承是没有意义的,前提是您只在可以使用接口的情况下才使用抽象类。 仅将抽象类用于无法通过接口执行的操作会更简单,在这种情况下,您将无法使用两个抽象父类。 注意:使

  • 用参数1导数创建的基构造函数导数线程正在用参数1运行 但是在JAVA中启动一个线程调用构造函数中的抽象方法安全吗?因为,就我所知,在C++和C#中,它在大多数情况下是不安全的。谢谢!

  • 我有以下类层次结构 改装日志: 但是当我在请求参数中发布事件实例时,只有抽象类被序列化。 改型Java接口: 我还注意到,在第二种情况下,字段序列化名称是,但它应该是!这使我认为改型对使用的与对参数使用的不同... 分级依赖关系 REST客户端

  • 本文向大家介绍php构造函数的继承方法,包括了php构造函数的继承方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php构造函数的继承方法。分享给大家供大家参考。具体如下: 第一种情况:子类没有定义构造函数时,默认继承。例子: 输出结果:小强 第二种情况:子类定义了构造函数,则不会被继承。实例: 输出结果:BBBBBB子类 第三种情况:如果需要调用父类的构造函数,则可以使用:paren

  • 问题内容: 我正在Google App Engine中制作一个购物车应用。我有许多从基本处理程序派生的类: 这是否意味着每个后代类的方法都需要具有相同的参数?这很麻烦。实际上只有一个后代使用该参数。而当我添加新的参数时呢?我需要遍历每堂课吗? 问题答案: 重写的方法原则上不必彼此具有相同的参数,但是它们必须具有与调用它们相同的形式参数。因此,由于任何处理程序都可以通过调用它,是的,它们必须相同。就

  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?