我尝试使用BaseComponentType
类重构我的代码,并在我的ElectricalComponentType
类(和类似的子类)中继承此代码,如下所示:
public abstract class BaseComponentType {
public static BaseComponentType findByUid ( Class klass, String uid ) {
return new Select().from( klass ).where( "uid = ?", uid ).executeSingle();
}
}
public class ElectricalComponentType extends BaseComponentType {
public static ElectricalComponentType findByUid( String uid ) {
return (ElectricalComponentType) findByUid( ElectricalComponentType.class, uid );
}
}
我需要做的是调用ElectricalComponentType.findByUid( 'a1234' )
,但如果我不必在findByUid
类中定义ElectricalComponentType
而是从{{BaseComponentType
继承此功能,那将会很棒。 1}}。
你会发现有两件事情阻碍了:
我需要ElectricalComponentType
父方法中的findByUid
课程。
我需要返回ElectricalComponentType
对象(或任何子类对象),而不是BaseComponentType
类对象。
有办法做到这一点吗?
答案 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
然后你不必担心继承问题。