【问题标题】:Find the right child-class during iteration of father-class Generics/Java/OOP在父类Generics/Java/OOP的迭代过程中找到正确的子类
【发布时间】:2020-12-20 10:52:06
【问题描述】:

我认为通过代码解释我的问题更容易。

假设一家销售公司有 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(每个 salesEmployee 计算方式不同,因此佣金不同)。 如果不使用 instanceof,如何询问我是否是 SalesEmployee1? 我想过在父类中添加一个每个孩子都覆盖的函数

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

而不是做这样的事情:

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

这个方法对吗?任何人都可以提出另一种解决方案,因为我觉得我做错了什么,因为这感觉像是一个变化的例子。 谢谢!

【问题讨论】:

  • 您可以通过在未知对象的Class 上调用(取决于您的用例)getName 或getSimpleName 来获取未知类型对象的类名 - 例如myObject.getClass().getName()
  • @TheHeadRush 感觉就像通过不同的方法使用 instanceof,这是解决我问题的正确方法吗?感谢您的快速回复。
  • 您有一个错误,即您将薪水存储在 Employee 类和 SalesEmployee1 类中,因此您隐藏了该变量。其次,在这种情况下,您可能应该使用 instanceof。
  • @AlBlue 你是对的,我更改了私有字段以更好地示例。并添加了解释(每个 salesEmployee 计算方式不同,因此佣金不同)。我不能使用 instanceof 这是我的问题。
  • 您可以简单地将Employee 转换为SalesEmployee1 并捕获并忽略ClassCastException。但是为什么不喜欢使用instanceof 呢?

标签: java oop iteration


【解决方案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;
}

【讨论】:

  • 我 100% 确定你是对的,这是家庭作业中的一个练习。我肯定这个问题本身是不正确的,现在我明白了,但仍然不得不问是否有办法。感谢所有的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多