我有一个类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。但我就是找不到处理这种情况的“标准”方法。所以我在寻找任何