面向对象的编程 - 创建子类



我有一个CSV文件,其中包含医生的详细信息:名称,姓氏,地址,城市,首选contact,联系ID和专业。

我创建了一个医生清单,我想在其中存储我的医生对象。我决定将scanner.nextLine()分开,然后将每个值解析为医生实例。

对我有用的,所有值的阅读均正确,并分配给与医生相关的正确变量,即姓名,姓氏等,但唯一的问题是,如果医生的专业是手术,我需要存储一个其他值是认证日期。

为此,我创建了一个扩展的外科医生课程,并尝试使用继承,但在此阶段迷路了,并且对如何解决此问题的想法用完了。

有人能告诉我我可以改变什么来完成这项工作?

public class Doctor 
{
    protected String name;
    protected String surname;
    protected String address;
    protected String city;
    protected String preferredContact;
    protected String contactID;
    protected String specialism;
    public Doctor()
    {
        this.name="";
        this.surname="";
        this.address="";
        this.city="";
        this.preferredContact="";
        this.contactID="";
        this.specialism="";
    }
    public Doctor(String name,String surname, String address, String city, String preferredContact, String contactID, String specialism)
    {
        this.name=name;
        this.surname=surname;
        this.address=address;
        this.city=city;
        this.preferredContact=preferredContact;
        this.contactID=contactID;
        this.specialism=specialism;
    }
    public void setName(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
    public void setSurname(String surname)
    {
        this.surname=surname;
    }
    public String getSurname()
    {
        return surname;
    }
    public void setAddress(String address)
    {
        this.address=address;
    }
    public String getAddress()
    {
        return address;
    }
    public void setCity(String city)
    {
        this.city=city;
    }
    public String getCity()
    {
        return city;
    }
    public void setPreferredContact(String preferredContact)
    {
        this.preferredContact=preferredContact;
    }
    public String getPreferredContact()
    {
        return preferredContact;
    }
    public void setContactID(String contactID)
    {
        this.contactID=contactID;
    }
    public String getContactID()
    {
        return contactID;
    }
    public void setSpecialism(String specialism)
    {
        this.specialism=specialism;
    }
    public String getSpecialism()
    {
        return specialism;
    }
    @Override
    public String toString()
    {
        return "nName:"+getName()
            +"nSurname: "+getSurname()
            +"nAddress: "+getAddress()
            +"nCity: "+getCity()
            +"nPreferred Means of Contact: "+getPreferredContact()
            +"nContact ID: "+getContactID()
            +"nSpecialism: "+getSpecialism()
            +"n";
    }
}
public class Surgeon extends Doctor
{
    protected String certificationDate;
    public Surgeon()
    {
        super();
        certificationDate="";
    }
    public Surgeon(String name,String surname, String address, String city, String preferredContact, String contactID, String specialism, String certificationDate)
    {
        super(name,surname,address,city,preferredContact,contactID,specialism);
        this.certificationDate=certificationDate;
    }
    public String getCertificationDate()
    {
        return certificationDate;
    }
    @Override
    public String toString()
    {
        return "nCertificationDate: "+certificationDate +"n";
    }
}
public class DoctorImport 
{
    public static void main (String[]args) 
    {   
        int index = 0;
        List<Doctor> doctorsList = new ArrayList<>();
        try
        {
            Scanner scanner=new Scanner(new File("DoctorsFile.csv"));
            Scanner dataScanner;
            while (scanner.hasNextLine())
            {
                dataScanner=new Scanner(scanner.nextLine());
                dataScanner.useDelimiter(",");
                Doctor myDoctor=new Doctor();
                Surgeon mySurgeon=new Surgeon();
                while(dataScanner.hasNext())
                {
                    String data= dataScanner.next();
                    switch (index) 
                    {
                        case 0:
                            myDoctor.setName(data);
                            break;
                        case 1:
                            myDoctor.setSurname(data);
                            break;
                        case 2:
                            myDoctor.setAddress(data);
                            break;
                        case 3:
                            myDoctor.setCity(data);
                            break;
                        case 4:
                            myDoctor.setPreferredContact(data);
                            break;
                        case 5:
                            myDoctor.setContactID(data);
                            break;
                        case 6:
                            myDoctor.setSpecialism(data);
                            break;
                         case 7:
                            mySurgeon.certificationDate=data;
                            break;
                     }
                    index++;
                }
                doctorsList.add(myDoctor);
                if((myDoctor.specialism).equals("Surgery"))
                {
                    doctorsList.add(mySurgeon);
                }
                index=0;  
            }
            System.out.print(doctorsList);
        } 
        catch (FileNotFoundException ex) 
        {
            System.out.print("Error, unable to locate the CSV File!");
        }
    }
}

一种方法是首先收集所有数据,然后以后创建正确的对象类型。我建议阅读出厂模式,因为它封装了关于要构建哪种类型对象的决策。

例如:

    ...
    String name = "";
    String surname = "";
    String address = "";
    String city = "";
    String preferredContact = "";
    String contactID = "";
    String specialism = "";
    String certificationDate = "";
    while(dataScanner.hasNext())
    {
        switch (index) 
        {
            case 0:
                name = dataScanner.next();
                break;
            case 1:
                surname = dataScanner.next();
                break;
            case 2:
                address = dataScanner.next();
                break;
            case 3:
                city = dataScanner.next();
                break;
            case 4:
                preferredContact = dataScanner.next();
                break;
            case 5:
                contactID = dataScanner.next();
                break;
            case 6:
                specialism = dataScanner.next();
                break;
            case 7:
                certificationDate = dataScanner.next();
                break;
            default:
                dataScanner.next();
                break;
        }
        index++;
    }
    if (specialism.equals("surgery")) {
        doctorsList.add(new Surgeon(name, surname, address, city, preferredContact, contactID, specialism, certificationDate));
    } else {
        doctorsList.add(new Doctor(name, surname, address, city, preferredContact, contactID, specialism));
    }

工厂模式可用于实现最后一部分,在执行哪个对象的决定中:

    doctorsList.add(buildDoctor(name, surname, address, city, preferredContact, contactID, specialism, certificationDate));

...调用工厂方法:

private Doctor buildDoctor(String name, String surname, String address, String city, String preferredContact, String contactID, String specialism, String certificationDate) {
    if (specialism.equals("surgery")) {
        return new Surgeon(name, surname, address, city, preferredContact, contactID, specialism, certificationDate);
    } else {
        return new Doctor(name, surname, address, city, preferredContact, contactID, specialism);
    }
}

我想,您的代码上有一些错误。

其中之一是:

您在阅读文件时已经初始化了医生对象,但是如果它具有专业,那么您会读取数据并将Surgen对象添加到列表中。但是您的外科医生对象没有信息,也没有链接到医生对象。

您的代码在某个时候有效吗?你测试过吗?如果是这样,我们可以从那时起工作。

问候。

问题是您正在创建医生和外科医生实例。然后,您填充医生实例;如果您有认证日期,则将其放在(否则为空的)外科医生实例中。

您需要根据某些标准创建一个或另一个实例。仅使用认证日期是否通过,就是做法不佳。也许专业领域会起作用。

如果您有外科医生实例,请将其分配给医生领域。然后,一个实例将填充所有信息。

最新更新