【问题标题】:Insert array list in parent class to override with subclasses在父类中插入数组列表以用子类覆盖
【发布时间】:2014-03-08 00:24:58
【问题描述】:

我是 OOP 和一般编程的新手。我在如何将东西放在父类中并从其他类和主类中调用它们时遇到了麻烦。

我在 main 中有以下 arraylist 创建者,但感觉真的是 OOP,它们应该在父类和子类中,并且只是从 main 调用。这是正确的,有人可以帮助我了解这将如何工作。

如何在父类中获取arraylist,然后从main中正确调用?

这是我的主要内容:

package ooo1;

import java.util.ArrayList;
import java.util.Scanner;

public class ContactList {

    public static void main(String[] args) {

        Scanner input1 = new Scanner(System.in);
        int type = 0;
        while(type != 5){
        System.out.println("Please select an option:");
        System.out.println("Personal Contact: Enter 1");
        System.out.println("Business Contact: Enter 2");
        System.out.println("Display Personal Contacts: Enter 3");
        System.out.println("Display Business Contacts: Enter 4");
        System.out.println("5 to quit");

        type = input1.nextInt();

        if(type == 5){
            System.out.println("Goodbye");
            break;
        }

        ArrayList<Contact> contacts = new ArrayList<Contact>();
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter ContactId : ");
        String contactId = input.nextLine();
        System.out.println("Please enter First Name : ");
        String firstName = input.nextLine();
        System.out.println("Please enter Last Name : ");
        String lastName = input.nextLine();
        System.out.println("Please enter Address : ");
        String address = input.nextLine();
        System.out.println("Please enter Phone Number : ");
        String phoneNumber = input.nextLine();
        System.out.println("Please enter Email Address : ");
        String emailAddress = input.nextLine();

        if(type == 1){
           System.out.println("Please enter Birthday: ");
           String dateofBirth = input.nextLine();
           Contact pcontact = new PersonalContact(contactId, firstName, lastName, address, phoneNumber, emailAddress, dateofBirth);
           contacts.add(pcontact);
        }

        else if(type == 2){
            System.out.println("Please enter Job Title: ");
            String jobTitle = input.nextLine();
            System.out.println("Please enter Organization: ");
            String organization = input.nextLine();
            Contact bcontact = new BusinessContact(contactId, firstName, lastName, address, phoneNumber, emailAddress, jobTitle, organization);
            contacts.add(bcontact);
        }

        }
        }


        }  

这是我为父类所拥有的:

package ooo1;

import java.util.ArrayList;
import java.util.Scanner;

public abstract class Contact {

    String contactId;
    String firstName;
    String lastName;
    String address;
    String phoneNumber;
    String emailAddress;

    public Contact(String contactId,String firstName,String lastName, String address, String phoneNumber, String emailAddress)
    {
        this.contactId = contactId;
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.phoneNumber = phoneNumber;
        this.emailAddress = emailAddress;
    }
    public void setContactId(String input){
        this.contactId = input;
    }
    public String getContactId(){
        return contactId;
    }

    public void setFirstName(String input){
        this.firstName = input;
    }
    public String getFirstName(){
        return firstName;
    }

    public void setLastName(String input){
        this.lastName = input;
    }
    public String getLastName(){
        return lastName;
    }

    public void setAddress(String input){
        this.address = input;
    }
    public String getAddress(){
        return address;
    }

    public void setPhoneNumber(String input){
        this.phoneNumber = input;
    }
    public String getPhoneNumber(){
        return phoneNumber;
    }

    public void setEmailAddress(String input){
        this.emailAddress = input;
    }
    public String getEmailAddress(){
        return emailAddress;        
    }

    void displayContacts(){
        System.out.println("Contact ID:" + contactId + " First Name:" + firstName + " Last Name:" + lastName);
        System.out.println("Address:" + address);
        System.out.println("Phone Number:" + phoneNumber);
        System.out.println("Email Address:" + emailAddress);
    }

}

我的一个子类:其他相同只是添加了一些变量: 显示联系人():不知道如何处理它。

/* * 要更改此许可标头,请在项目属性中选择许可标头。 * 要更改此模板文件,请选择工具 |模板 * 并在编辑器中打开模板。 */

包ooo1;

公共类 PersonalContact 扩展联系人 {

private String dateofBirth;

public PersonalContact(String contactId, String firstName, String lastName, String address, String phoneNumber, String emailAddress, String dateofBirth){

    super(contactId, firstName, lastName, address, phoneNumber, emailAddress);

    this.dateofBirth = dateofBirth;
}
public void setDateofBirth(String input){
    this.dateofBirth=input;
}
public String getDateofBirth(){
    return this.dateofBirth;
}
@Override
public void displayContacts(){
    System.out.print("Personal Contacts: ");
    System.out.println("Contact ID:" + contactId + " First Name:" + firstName + " Last Name:" + lastName);
    System.out.println("Address:" + address);
    System.out.println("Phone Number:" + phoneNumber);
    System.out.println("Email Address:" + emailAddress);
    System.out.println("Birthday:" + dateofBirth);
}

}

【问题讨论】:

  • 我认为Contact 只代表1 个联系人是对的。如果您想将列表分开,那么您可以考虑创建一个包含联系人集合的 AddressBook 类。
  • 如果我离开这种方式对如何打印联系人列表感到困惑。我需要将它们按个人和企业分开,并且需要能够通过contactID呼叫某个联系人。如果我能让打印功能正常工作,我会认为这是第一次尝试这很好。如果创建了一个地址簿类,那将如何工作。

标签: java oop arraylist


【解决方案1】:

你可能想要这样的东西。

public class AddressBook<T extends Contact>
{

  private List<T> contacts = new ArrayList<T>();

  public void addContact(T contact)
  {
    contacts.add(contact);
  }

}

你可以像这样实例化和使用这个类。

AddressBook<Contact> book = new AddressBook<Contact>();
book.add(new PersonalContact(...));
book.add(new BusinessContact(...));

然后,随着时间的推移,您可以灵活地向 AddressBook 添加与基础集合一起使用的方法。例如,您可能想要搜索具有特定姓名的联系人。或者返回按特定属性排序的联系人迭代器。

【讨论】:

  • 我确信这是一个愚蠢的问题:我知道我需要它在哪里,但似乎无法到达那里。 指的是什么。对不起,我越来越糊涂了。
  • T 是泛型类型。您可以实例化类型为联系人的地址簿,或者您可以更具体地说此地址簿只能保存个人联系人。
【解决方案2】:

你可以在 Contact 类中添加一个方法:

public void getData(){
// take in all the inputs here, so that you can directly store them in class member variables instead of passing them from main.
}

假设 PersonalContact 和 BusinessContact 是从 Contact 继承的类。 您可以在其中添加一个方法:

class PersonalContact extends Contact{  
String dateofBirth;
public void getData(){
super.getData();  //calls getData() method from base class
// take DOB as input & store it
}

BusinessContact 类也是如此。

我建议你看看抽象类和接口以备将来使用。

【讨论】:

  • getData 对该方法来说是个坏名字,因为它不是一个 getter。
  • 该方法确实从用户那里获取数据。我在cmets中写过。
  • 所以你希望你的模型类绑定到 UI 并提示用户输入?我希望我误解了。
  • 我没听懂您的意思。您可以在 Contact 中添加一个新的 Scanner 对象作为类成员,并且 getData 方法将使用此 Scanner 对象提示用户输入。跨度>
  • 该设计将您的模型(联系人类)与 UI(扫描仪)高度耦合。这是糟糕的 OO 设计。
【解决方案3】:

Contact 类似乎没问题。但是ContactList 没有那么多。它应该是联系人的数据结构,所以没有理由在那里使用 main 方法。

public class ContactList {

     private ArrayList<Contact> contacts;       

     public ContactList(){
          this.contacts = new ArrayList<Contact>();
     }

     public void addContact(Contact contact){
          this.contacts.add(contact);
     }

     public Contact getContact(int index){
          return contacts.get(index);
     }

     // other methods that work with the data structure
     // f.e. searching, deleting, ...

}

然后你可以有一些 ContactUtil 类来负责读取用户的联系信息(你在你的 main 方法中拥有什么)。

public final class ContactUtil {

    private ContactUtil(){} // we don't want to create instances of this class

    public static Contact readNewContact(){

         Scanner input1 = new Scanner(System.in);
         int type = 0;
         ...


         return contact;
    }   

}

最后你会为main()上一堂课:

public class Main {

      public static void main(String[] args){

           ContactList myContacs = new ContactList();
           myContacts.add(ContactUtil.readNewContact());

           Contact contact = ContactUtil.readNewContact();
           myContacts.add(contact); 

      }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多