#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
к aSalesEmployee1
и перехватить и игнорировать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% уверен, что вы правы, это упражнение, данное в домашнем задании. Я уверен, что сам вопрос неверен, и теперь я это понимаю, но все же должен был спросить, есть ли способ. спасибо за всю помощь.