Найдите правильный дочерний класс во время итерации обобщений отцовского класса / Java /ООП

#java #oop #iteration

#java #ооп #итерация

Вопрос:

Я думаю, что объяснить мой вопрос с помощью кода проще.

Например, для торговой компании, в которой работает 2 сотрудника по продажам:

 public class Employee()
{
private int salary;
}
public class SalesEmployee1 extends Employee()
{
private int commisionRate;

}

public class SalesEmployee2 extends Employee()
{
private int commisionRate;
}
 

Предположим, у меня есть вектор: Vector<Employee> v = new Vector<>();
Мне нужно выполнить итерацию по этому вектору и найти SalesEmployee1 с наименьшей комиссией (каждый сотрудник отдела продаж вычисляет его по-разному, поэтому его комиссия разная).
Как я могу спросить, являюсь ли я сотрудником1 по продажам, не используя instanceof?
Я подумал о добавлении функции в родительский класс, которую переопределяет каждый дочерний класс

 public boolean myClass(String name)
{
    return name.equals(ClassName for example SalesEmployee1);
}
 

и чем сделать что-то подобное:

 for(Employee e : v)
{
    if(e.myClass("SalesEmployee1")
         doSmth()...
}
 

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

Комментарии:

1. Вы можете получить имя класса объекта неизвестного типа, вызвав (в зависимости от вашего варианта использования) getName либо getSimpleName Class неизвестный объект, например myObject.getClass().getName()

2. @TheHeadRush похоже на использование instanceof другим методом, является ли это правильным решением для моей проблемы? Спасибо за быстрый ответ.

3. У вас есть ошибка в том, что вы сохраняете зарплату в классе Employee, а также в классе SalesEmployee1, поэтому вы затеняете эту переменную. Во-вторых, вам, вероятно, следует использовать instanceof в этом случае.

4. @AlBlue вы правы, я изменил личное поле, чтобы улучшить пример. и добавлено объяснение (каждый сотрудник отдела продаж вычисляет его по-разному, поэтому его комиссия разная). Я не могу использовать instanceof это мой вопрос.

5. Вы могли бы просто привести Employee к a SalesEmployee1 и перехватить и игнорировать ClassCastException . Но почему такое отвращение к использованию instanceof ?

Ответ №1:

Вся цель объектно-ориентированного программирования заключается в том, что каждый (под-) класс знает свое собственное поведение. Не должно быть необходимости определять конкретный класс объекта во время выполнения. Это признак того, что что-то не так в вашем дизайне, если вы чувствуете необходимость определить класс объекта.

Различные типы сотрудников должны сами знать, как рассчитать комиссию:

 public class Employee()
{
    abstract int calculateCommission();
}
public class SalesEmployee1 extends Employee()
{
    int calculateCommission() { ... }

}

public class SalesEmployee2 extends Employee()
{
    int calculateCommission() { ...}
}
 

Тогда вы сможете через всех Сотрудников найти самую низкую комиссию:

 for(Employee e : v) {
    int commission = e.calculateCommission();
    // do something with the commission;
}
 

Комментарии:

1. Я на 100% уверен, что вы правы, это упражнение, данное в домашнем задании. Я уверен, что сам вопрос неверен, и теперь я это понимаю, но все же должен был спросить, есть ли способ. спасибо за всю помощь.