java继承最佳实践?

时间:2013-12-11 12:17:41

标签: java oop inheritance

我有以下课程。

public class BaseRequest {
    protected List<Emp> names;  // names property is required in many classes 
}

public class FirstRequest extends BaseRequest {

    public FirstRequest() {
        names = new ArrayList<Emp>();
    }

    public setNames(List<Emp> names){
        super.names = names;
    }

    public List<Emp> getNames(){
        return super.names;
    }
}

public class ServiceClass {

    public void someMethod(List<Emp> emps) {
        FirstRequest request = new FirstRequest();
        request.setNames(emps);
        //Some Logic
    }
}

我正在以正确的方式继承吗?我怎么能进一步改善呢?

谢谢!

3 个答案:

答案 0 :(得分:0)

取决于你想要做什么,对于这段代码,大多数事情似乎都没问题。 可能想改变

FirstRequest request = new FirstRequest();

BaseRequest request = new FirstRequest();

在超类中使用getters / setter。

此外,在FirstRequest的构造函数中,您应该与超类对话(例如,在那里执行ArrayList初始化)

 public FirstRequest(){
 super();
 }

并且在超级班级

public BaseRequest()
{
// initialisation
}

答案 1 :(得分:0)

您可以将BaseRequest转换为接口,并仅提供客户端使用的方法的签名。客户端应该只对提供的方法(api)感兴趣,而不是实现细节然后您可以在所有类中实现它们实现接口。界面更灵活:

public interface BaseRequest {
    List<Emp> getEmps();
    void setEmps(List<Emp> list);
    ....
}


public class FirstRequest implements BaseRequest{

    List<Emp> getEmps(){
        return ...;
    }

   ....
}

答案 2 :(得分:0)

  

我怎样才能进一步改善它?

将与names相关的方法移至基类中,并制作names private

public class BaseRequest {
    private List<Emp> names = new ArrayList<Emp>();

    public setNames(List<Emp> names){
        this.names = names;
    }

    public List<Emp> getNames(){
        return names;
    }
}

public class FirstRequest extends BaseRequest {
    // the rest of your stuff
}

您应该避免使names受到保护:对于派生类和该类的其他用户,公共getter应该足够好。