2016-10-17 3 views
1

У меня есть два похожих объекта класса. У меня есть несколько методов для объекта первого класса, который я также хочу повторно использовать для моего объекта второго класса, но я не уверен, как и я не хочу писать повторяющиеся методы.Повторное использование метода проверки. Convert object

Я извлек и упростил пример, чтобы показать, как я думаю.

первый класс

public class FirstClass { 
    int number; 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 
    ... 
} 

Второй класс

public class SecondClass { 
     int number; 

     public int getNumber() { 
      return number; 
     } 

     public void setNumber(int number) { 
      this.number = number; 
     } 
     ... 
    } 

Третий класс

public class Main { 
    public static void main(String[] args) { 
     FirstClass firstClass = new FirstClass(); 
     firstClass.setNumber(5); 
     SecondClass secondClass = new SecondClass(); 
     secondClass.setNumber(5); 

     numberIsFive(firstClass); 
     numberIsFive(secondClass); 
    } 

    public void numberIsFive(Object myObject){ 
     if(myObject instanceof FirstClass){ 
      myObject = (FirstClass)myObject; 
     }else if(myObject instanceof SecondClass){ 
      myObject = (SecondClass)myObject; 
     } 

     if(myObject.getNumber() == 5){ 
      System.out.println("is five"); 
     }else{ 
      System.out.println("is not five"); 
     } 
     ... 
    } 
} 

и не numberIsIFive (firsclass.getNumber()) это не вариант, так как методы, которые я использую имеют гораздо больше доказательств.

заранее спасибо

ответ

4

Для этого случая, который мог бы быть «над-инженерии», но в целом вы бы смотреть в сторону композиции здесь, как:

interface IntValueHolder { 
    int getNumber(); 
    void setNumber(int value); 
} 

class IntValueHolderImpl implements IntValueHolder { ... 

И тогда вы бы «падение «код, который у вас есть в обоих ваших классах, и вместо этого оба класса (каким-то образом) имели бы экземпляр IntValueHolder.

В вашем случае, возможно, было бы более уместно просто, чтобы ваши два класса реализовали этот «общий» интерфейс IntValueHolder - чтобы, по крайней мере, избегать повторных вызовов экземпляра и downcast (вплоть до определенного класса).

Редактировать: конечно, другой вариант заключается в использовании наследования здесь - сделать ваши два класса проистекающими из некоторого базового класса, который обеспечивает такое поведение. Но использование наследования, чтобы избежать дублирования кода, в большинстве случаев является плохим. Классы наследуют друг от друга, потому что это делает «смысл» в базовой модели, а не для сохранения строки кода.

+0

Как насчет использования наследования? – dcalap

+1

Я обновил свой ответ на эту мысль. – GhostCat

+0

Все ответы, где действительно хорошее спасибо. Я согласился с этим, потому что он был самым близким к решению, которое я использовал. – Benny

1

Вы должны создать interface и применять его в обоих классах, а затем сделать ваш метод проверки получить интерфейс вместо с Object

Пример:

public interface Number { 

    int get(); 

    void set(int n); 
} 

Тогда ваши классы будут выглядеть следующим образом:

public class FirstClass implements Number { 

    int number; 

    @Override 
    public int get() { 
     return number; 
    } 

    @Override 
    public void set(int n) { 
     this.number = n; 
    } 
} 

И ваш метод проверки получает номер:

public void numberIsFive(Number myNumber){ 
... 
} 
+0

Я думаю, что вы хотели написать публичный номер пустотыIsFive (Number myNumber) { – maxpovver

2

Прежде чем продолжить, я рекомендую вам прочитать об этом и других объектно-ориентированных концепциях программирования самостоятельно.

Сосредоточение на этом конкретном случае, вы должны создать базовый класс, такую ​​как

public class BaseClass { 
    int number; 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 
} 

который включает в себя все общие поля и методы вашего FirstClass и SecondClass. Затем удалите эти методы из двух текущих классов и просто создайте их как public class FirstClass extends BaseClass, чтобы дать им функциональность BaseClass.

Наконец, вам придется изменить свой метод проверки, чтобы принимать только объекты, принадлежащие вашему базовому классу, делая это следующим образом: public void numberIsFive(BaseClass myObject) (как правило, у вас будет гораздо меньше ошибок, приняв определенный класс в метод, а не прием любого старого объекта).

Редактировать: Другие ответчики правильные, и наследование также является допустимым решением. Какой из них вы будете использовать, будет зависеть от того, что имеет больше смысла в контексте вашего приложения.

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