【发布时间】:2021-09-09 16:09:45
【问题描述】:
我对 Java 还很陌生,所以我不知道这是否是一种不好的做法,甚至可能,但让我们开始吧。
我正在尝试了解地图中继承的工作原理。假设我有这三个类:
public abstract class Person{
private String ssNumber;
public void genericPersonMethod(){/*do thing*/}
}
public class Patient extends Person{
private String patientID;
public void specificPatientMethod(){/*do thing*/}
}
public class Medic extends Person{
private String medicID;
public void specificMedicMethod(){/*do thing*/}
}
}
然后我尝试为每个扩展类构建某种粗略的数据库。我试过这样做:
public abstract class PersonDB extends HashMap<String, Person>{
private RandomObject personDBGenericProperty;
public void genericThingToDoWithAPersonDB(){}
}
public class PatientDB extends PersonDB{
private RandomObject patientDBSpecificProperty;
public void specificThingToDoWithaPatientDB(){}
}
但后来我发现它不起作用,它不能有效地将PersonDB 扩展到另一个类。如果我只做一些PatientDB extends PersonDB 和MedicDB extends PersonDB,问题是我理论上可以同时插入Patients 和Medics,而且我无法访问任何一个类的特定方法,因为它们都被认为是@ 987654330@s。执行PatientList<String, Patient> extends PersonDB 更糟糕,因为它随后接受任何 种Object。老实说,我不知道下一步该做什么。
此外,即使出于某种原因这最终成为不好的做法(在这种情况下,我愿意学习任何可用的解决方法),我仍然想知道是否有办法以这种特定方式做到这一点,只是出于好奇。
【问题讨论】:
-
我试图了解这里的结构。当您说可以同时插入
Patient和Medic时,是通过PersonList 类中的方法吗?此外,在读取此数据时,您可以根据您使用的是PatientList还是MedicList,将Person类型转换为所需的子类。现在这里有一个有趣的地方是MedicList如何知道它是否收到了来自PersonList的Medic或Patient。这可以通过在 Person 类中提供一个鉴别器来将一个人标记为医生或患者来处理。让我知道您对此的看法! -
当我说我可以同时插入
Patient和Medic这是因为PatientList和MedicList根本不区分,因为它们都继承自PersonList类,它又从<String, Person>映射延伸。由于两者都是Persons,我想它们都适合列表。我没有考虑选角,因为我知道这不太理想,所以如果可能的话,我想避免它,并有很强的歧视性。关于最后一点,我真的不知道如何做到这一点。 -
感谢您的解释。我可以问一下为什么你认为铸造不太理想。无论如何,如果您想要更强烈的区分,您需要在
Patient和Medic实例之间保持某种分离。一种方法是使用我提到的鉴别器方法。简单地说,你在你的 Person 类中添加一个字段,告诉你一个人是Medic还是Patient。现在在您的PatientList实现中,即使您从一个公共列表中获取 Persons,您也可以过滤掉非患者以确保您的PatientList仅返回Patients -
好电话,他们得到了这个名字,因为它们最初是列表,然后我改变了类型;我马上修改。
标签: java generics inheritance hashmap