如何用抽象类输出

时间:2012-04-24 20:31:12

标签: java abstract tostring

我是继承和抽象类的新手。

对于这个例子,我正在设计一个可以拥有个人或企业的电话簿。此人具有标题,名字,姓氏和电话号码。该公司有一个公司名称和电话号码。 我用抽象方法getName创建了一个抽象类 (这对你们来说听起来很简单,但请耐心等待我!)

public  abstract class PhoneBook {

private String phone;


public boolean setPhone(String p) //final
{
    boolean flag = false;
    if(p.length()!= 10)
    {
        flag = false;
    }

    for (int i = 0; i < p.length(); i++)
    {
        if(Character.isDigit(p.charAt(i)))
        {
            phone = p;
            flag = true;
        }
    }
    return flag;
}

public abstract String getName();

}

我的两个子类是Person and Business。 person的getName方法连接title,f name,l name。 在主要内容中,我创建了一个可以同时容纳个人或企业的PhoneBook数组(抽象数组)。

我输出有困难...如何访问getPhone(在抽象类中)输出它?

这是主要的(我目前只在人员部分工作)

import javax.swing.*;

公共类PhoneBookEntries {

public static final int MAX = 100;

public static void main(String[] args) {

    PhoneBook[] phone = new PhoneBook[100];
    int selection;
    int i = 0;

    do{
        selection = Integer.parseInt(JOptionPane.showInputDialog("Would you like to add a\n1.person\n2.business\nto the phone book?"));

    switch(selection)
    {
    case 1: phone[i]= fillPerson();
        break;
    case 2: fillBusiness();
        break;
    }

    }while(i < MAX && JOptionPane.showConfirmDialog(null, "Add another entry to phone book?")==JOptionPane.YES_OPTION);

    //output
    String output;
    output = phone[i].getName();
    JOptionPane.showMessageDialog(null, output);

}

private static PhoneBook fillPerson()
{
    Person someone = new Person();
    someone.setTitle(JOptionPane.showInputDialog("Enter your title\n(Mr., Mrs., Ms., or Dr.)"));
    someone.setFName(JOptionPane.showInputDialog("Enter the first name of the person: "));
    someone.setLName(JOptionPane.showInputDialog("Enter the last name of the person: "));
    while(!someone.setPhone(JOptionPane.showInputDialog("Enter your 10 digit phone number: ")))
        JOptionPane.showMessageDialog(null, "Error. Please enter only 10 numerical values\n(examle: 7034567890");
    return someone;
}

private static void fillBusiness()
{

}

}

getName我可以轻松访问,因为我有PhoneBook []。我以为我需要一个toString in Person来把所有东西都放在一起(同时名字和电话号码)但是在主要的我无法访问那个toString,因为我没有实例化人员? 对不起,如果这令人困惑......我只是打字我的(可怜的)思路......

3 个答案:

答案 0 :(得分:2)

您应始终能够在任何对象上调用toString(),因为这是在java.lang.Object上定义的方法,它是所有其他类的超类。

因此,如果您覆盖toString()课程上的Person,那么从Abstract类调用它不会有任何问题。

我不完全确定你的问题是什么,但这里是Person的toString实现的一个例子:

@Override
public String toString(){

    StringBuilder result = new StringBuilder();
    String NEW_LINE = System.getProperty("line.separator");

    result.append(this.getClass().getName() + " Object {" + NEW_LINE);
    result.append(" Title: " + getTitle() + NEW_LINE);
    result.append(" FName: " + getFName() + NEW_LINE);
    result.append(" LName" + getLName + NEW_LINE );
    result.append("}");

    return result.toString();
}

答案 1 :(得分:0)

你应该在你的抽象类中添加一个getPhone方法(或者任何常见的方法,这就是接口/抽象类的全部意义)

public String getPhone(){
    return phone
}

如果您需要某种特定格式的人或商务电话覆盖该方法(或使getter抽象。这取决于您的要求,但我想普通的旧getter是好的)

答案 2 :(得分:0)

我认为问题的一部分可能是概念性的 - 让我对抽象类等问题进行一些讨论。

任何类背后的想法都是代表你系统的某些部分 - 你用名词表示的东西是你正在编写的系统的一部分。你在'人'和'商业'中有很好的例子;在这种应用程序中还有其他方法可以做,但这是一个好的开始。

另一张提到“入境”的海报,我认为在这种情况下,抽象课程是一个很好的候选人 - 电话簿中的一个“入口”既可以是企业也可以是个人;所以电话簿可以充满“条目”,每个条目都是企业或个人。

当一个类继承自另一个类时,最好是“子类” - 此处的业务或人员 - 是基类的特殊情况 - 在这种情况下是条目。

条目上定义的方法应反映条目,而不依赖于该条目上的特定类。例如,将一个getFirstName()方法放在Entry中是错误的,除非它应用于Entry的每个可能的子类。由于我们通常认为某个企业没有名字,这可能是我们只能在Person中找到的方法。

因此,您可以在Entry中使用方法,例如,可以返回显示条目所需的信息。你可以有一个方法getDisplayName();在Entry中它是一个空方法,只是定义它不接受任何参数并返回一个String,在Person中它可以放在最后,第一,中间或任何你想要的东西;在商业中,它可以获得商业名称。

还有一点 - 你不想在任何与“输出”有关的类中添加任何内容;这些是包含应用程序“业务对象”的类,您可以使用其他处理所有形式的输出的类。当然,用于调试的System.out.println语句没有任何问题。