【问题标题】:Is there a way to template astract methods so that a parameter to an abstract method will be typed the same as the implementing subclass?有没有办法模板抽象方法,以便抽象方法的参数与实现子类的类型相同?
【发布时间】:2019-12-01 16:05:16
【问题描述】:

有没有办法模板抽象方法,以便抽象方法的参数与实现子类的类型相同?换句话说,如果我们有:

class Super {
    abstract void a_method( <Sub> param );
}

class Sub_A extends Super {
    void a_method( Sub_A param ){
        ...
    }

class Sub_B extends Super {
    void a_method( Sub_B param ){
        ...
    }
}

然后每个子类都将自己的类型作为该方法的参数。我想避免使用接口或反射。

【问题讨论】:

    标签: java parameter-passing abstract-class


    【解决方案1】:

    通常的做法是引入一个泛型参数:

    abstract class Super<Sub extends Super> {
        abstract void a_method(Sub param);
    }
    
    class Sub_A extends Super<Sub_A> {
        void a_method(Sub_A param) {
    
        }
    }
    
    class Sub_B extends Super<Sub_B> {
        void a_method(Sub_B param) {
    
        }
    }
    

    据我所知,您不能强制子类将自己传递为 T,例如可以定义class Sub_C extends Super&lt;Sub_A&gt;。不确定这是否有问题。


    遵循 java 命名约定,它应该如下所示:

    abstract class Super<S extends Super> {
        abstract void aMethod(S param);
    }
    
    class SubA extends Super<SubA> {
        void aMethod(SubA param) {
    
        }
    }
    
    class SubB extends Super<SubB> {
        void aMethod(SubB param) {
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      This answer is correct。以防万一有人遇到这种情况但像我一样使用 Kotlin,这里是它的要点

      abstract class AbstractParam
      
      abstract class AbstractClass<T: AbstractParam> {
          abstract fun f(p: T)
      }
      
      class Param: AbstractParam()
      
      class Class: AbstractClass<Param>() {
          override fun f(p: Param) {}
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-10
        • 1970-01-01
        • 2020-03-12
        • 2014-11-24
        • 1970-01-01
        • 2016-12-28
        • 1970-01-01
        • 2018-12-15
        相关资源
        最近更新 更多