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

将派生类传递给需要重写基类的方法

夏侯兴怀
2023-03-14
问题内容

我有一个类A,具有抽象方法doAction(BaseClass obj),期望类型为BaseClass的参数

public class A {
    //....
    abstract void doAction(BaseClass obj);
    //....
}

现在,我还有另一个需要扩展A的类B。但是,B的doAction方法需要使用对象DerivedClass来扩展BaseClass。

public class B extends class A {
     //..
     void doAction(DerivedClass obj) {
          obj.callMethodAvailableOnlyInDerivedClass();
      }

 }

当我需要将DerivedClass类型的参数传递给需要BaseClass的方法时,该如何处理呢?

谢谢!


问题答案:

您使基类通用:

public class A<T extends BaseClass> {
    //....
    abstract void doAction(T obj);
    //....
}

以及使用派生类参数化的子类:

public class B extends A<DerivedClass> {
     //..
     void doAction(DerivedClass obj) {
         obj.callMethodAvailableOnlyInDerivedClass();
     }
}

没有泛型,这是不可能的,因为B会破坏A的契约:A接受任何种类的BaseClass,但是您限制B只接受特定的子类。这不符合Liskov原理。



 类似资料:
  • 我无法将派生类传递给接受基类作为参数的函数。基类由“障碍物”组成,这些障碍物将被放置在“板”上。无效的board::setvalue(int-length、int-width、board 但是,这会导致编译器给出“未知参数转换…”错误。在浏览站点时,我发现我应该将派生对象作为常量进行传递,但这会导致问题,因为无法将常量分配给线路板(因为它包含指向非常量障碍物的指针)。 反过来,将线路板更改为包含常

  • 问题内容: 我有以下代码片段: 执行代码时出现异常: 我不明白为什么会有和例外。有人可以帮助我理解吗? 您可以在此处检查代码。 问题答案: 创建一个对象,这意味着首先调用其超类构造函数,然后依次调用-但您已覆盖它,因此它是该方法的子版本。在该方法中,您调用尚未初始化的。 结论:在构造函数中调用可重写方法几乎从来不是一个好主意。

  • 我有以下代码: 我知道对于1和3,它打印“2”,因为调用了最特定的参数类型。但无法理解为什么2打印“2”。

  • 问题内容: 我有两个Java类:B,它扩展了另一个类A,如下所示: 我想打电话给。我来自C++界,我不知道如何用Java做这个基本的事情。 问题答案: 您要寻找的关键字是。例如,请参阅本指南。

  • 问题内容: 为什么派生类的重写方法不应该比java中的基类更严格。为什么编译器会抛出错误?您能否请任何人解释原因? 问题答案: 关键是,仅知道您的 超类 的调用者仍应能够使用给定的 子类的 任何实例。考虑这种情况: 现在从另一个包中,想象我们有: 我们这样称呼: 您希望这样做吗?您正在重写该方法,因此它 应该显示 “包访问”-但这意味着您正在从其他包中调用一个包访问方法… 基本上,这只是“ 里斯科

  • 对于来说,既断言其派生类具有方法,又包含关于应该做什么的文档,有什么好的、明确的方法呢? 现在,我正在使用: 但是,assert表达式只在创建Bird类之后才显示,并且不是可以通过访问的“真正的”docstring。 我知道这是一个悬而未决的问题,但还有什么更好的方法?首先在中定义并不违反规则,可能只是使用body和一个docString。但我就是找不到处理这种情况的“标准”方法。所以我在寻找任何