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

2022-09-03 05:31:33

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

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

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

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

 }

如何处理这种情况,如果我需要将派生类类型的参数传递给要重写的方法,而它正在期待一个基类?

谢谢!


答案 1

使基类泛型:

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只接受特定的子类。这不符合李氏原则


答案 2

您可以使用:

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


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

}

推荐