Java:在子类中使用父类的静态方法

时间:2014-05-03 17:05:06

标签: java inheritance abstract-class static-methods

我尝试使用BaseComponentType类重构我的代码,并在我的ElectricalComponentType(和类似的子类)中继承此代码,如下所示:

BaseComponentType.java

public abstract class BaseComponentType {

    public static BaseComponentType findByUid ( Class klass, String uid ) {

        return new Select().from( klass ).where( "uid = ?", uid ).executeSingle();

    }

}

ElectricalComponentType.java

public class ElectricalComponentType extends BaseComponentType {

    public static ElectricalComponentType findByUid( String uid ) {

        return (ElectricalComponentType) findByUid( ElectricalComponentType.class, uid );

    }

}

我需要做的是调用ElectricalComponentType.findByUid( 'a1234' ),但如果我不必在findByUid类中定义ElectricalComponentType而是从{{BaseComponentType继承此功能,那将会很棒。 1}}。

你会发现有两件事情阻碍了:

  1. 我需要ElectricalComponentType父方法中的findByUid课程。

  2. 我需要返回ElectricalComponentType对象(或任何子类对象),而不是BaseComponentType类对象。

  3. 有办法做到这一点吗?

4 个答案:

答案 0 :(得分:7)

使用泛型并且只有父类方法:

public abstract class BaseComponentType {
    public static <T extends BaseComponentType> T findByUid(Class<T> klass, String uid) {
        return new Select().from( klass ).where( "uid = ?", uid ).executeSingle();
    }
}

答案 1 :(得分:0)

有几点需要注意:

  • static方法未被继承,无法覆盖;
  • 要调用父类的static方法,您必须先编写类名:BaseComponentType.findById();

如果你想在子类中删除具有相同名称的方法,你可能想要使它成为非静态的或/并重新考虑你的类设计,因为如果在类绑定中有两个具有相同名称的静态方法与继承关系,很可能是类设计有问题。

答案 2 :(得分:0)

我希望你需要像以下那样......

public class TestClass{
    public static void main(String args[]){
        Child c2;
        c2 = (Child) Child.findByUid(Child.class, "123");
        System.out.println(c2.getClass());
    }            
}

class Base{
    public static Base findByUid ( Class klass, String uid ) {
        System.out.println(klass);
        Child c = new Child();
            //execute your query here and expect it to return the type of object as the class by which it was called
        //your parent class method always returns the type of the child by which the method was called
        return c;

    }

}

class Child extends Base{
    /*public static Child findByUid( String uid ) {
        System.out.println(Child.class);
        return (Child) findByUid( Child.class, uid );

    }*/
}

答案 3 :(得分:0)

我认为你可以重新设计这个,这样你就可以找到ComponentFinder的{​​{1}}课程。

Component

然后你不必担心继承问题。