0

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

对于这个例子,我正在设计一个可以包含个人或企业的电话簿。该人具有头衔、名字、姓氏和电话号码。该企业有一个企业名称和一个电话号码。我用抽象方法 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();

}

我的两个子类是人员和业务。该人的 getName 方法将标题、f 名称、l 名称连接起来。主要是我创建了一个电话簿数组(抽象数组),它可以容纳一个人或一个企业。

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

这是主要的(我目前只处理人员部分)

import javax.swing.*;

公共类电话簿条目{

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 来将所有内容(同时姓名和电话号码)混合在一起,但主要是因为我没有实例化 Person ,所以我无法访问该 toString ?抱歉,如果这令人困惑...我只是在输入我的(可怜的)思路...

4

3 回答 3

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();
}
于 2012-04-24T20:38:12.703 回答
0

我认为问题的一部分可能是概念性的——让我来谈谈抽象类之类的。

任何类背后的想法都是代表你系统的某个部分——你可以用一个名词来代表你正在编写的系统的一部分。您在“人”和“业务”中有很好的例子;在这种应用程序中还有其他方法可以做事,但这是一个好的开始。

另一张海报提到了“Entry”,在这种情况下,我认为它是抽象类的一个很好的候选——电话簿中的一个“条目”可以是企业或个人;所以电话簿可以充满“条目”,每个条目要么是一个企业,要么是一个人。

当一个类从另一个类继承时,最好是“子类”——此处为 Business 或 Person——是基类的特例——在本例中为 Entry。

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

因此,您可以在 Entry 中有方法,例如,可以返回显示条目所需的信息。你可以有一个方法 getDisplayName(); 在 Entry 中它是一个空方法,只是定义它不带参数并返回一个字符串,在 Person 中它可以将 last、first、middle 或任何你想要的放在一起;在 Business 中,它可以改为获取公司名称。

还有一点——你不想在这些类中放任何与“输出”有关的东西;这些是保存应用程序“业务对象”的类,您将拥有其他处理所有形式的输出的类。当然,用于调试的 System.out.println 语句没有任何问题。

于 2012-04-24T21:37:06.580 回答
0

你应该getPhone为你的抽象类添加一个方法(或者任何常见的方法,这就是接口/抽象类的重点)

public String getPhone(){
    return phone
}

如果您需要一些特定格式的个人或商务电话覆盖该方法(或使吸气剂抽象。这取决于您的要求,但我想普通的旧吸气剂是可以的)

于 2012-04-24T21:06:09.907 回答