2013-12-11 3 views
1

У меня есть классы ниже.java 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 
    } 
} 

Я делаю наследование в правильном направлении? как я могу улучшить его дальше?

Спасибо!

+2

использовать 'BaseRequest request = new FirstRequest();' вместо 'FirstRequest request' в стороне' ServiceClass' –

+0

@SantoshJoshi, тогда ему также нужно объявить геттеры и сеттеры на суперклассе, хотя он может быть абстрактным и реализовывать их. – RamonBoza

+2

Почему «имена» определены в «BaseRequest», но сеттер и получатель, а также инициализация в «FirstRequest»? Там могут быть причины для этого, но если это специально, переместите этот код в «BaseRequest». – Thomas

ответ

0

Как я могу я улучшить его дальше?

Перенесите методы, связанные с names в базовый класс, и сделать namesprivate.

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 защищено: общественный поглотитель должен быть достаточно хорош для производных классов и для других пользователей класса.

0

В зависимости от того, что вы хотите сделать, для этой части кода большинство вещей выглядит нормально. может захотеть изменить

FirstRequest request = new FirstRequest(); 

к

BaseRequest request = new FirstRequest(); 

и использовать геттеры/сеттер в суперклассе.

Кроме того, в конструкторе FirstRequest, вы должны поговорить с супер класс (сделать в ArrayList инициализации там, например)

public FirstRequest(){ 
super(); 
} 

и в супер классе

public BaseRequest() 
{ 
// initialisation 
} 
0

Вы можете конвертировать BaseRequest в интерфейс и предоставлять только подписи методов, которые будут использоваться клиентами. Клиент должен интересоваться только предоставленными методами (api), а не деталями реализации. Затем вы можете реализовать их во всех классах, реализующих интерфейс. Он является более гибким интерфейсом:

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


public class FirstRequest implements BaseRequest{ 

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

    .... 
} 
Смежные вопросы