2012-04-24 67 views
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.*; 

公共类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在一起(所有的名字和电话号码),但在主要我不能访问该toString,因为我没有一个人实例化? 很抱歉,如果这是混乱...我只是打字思想的我(差)的火车......

+0

为什么你不能在抽象类中做'this.getPhone()'?只需在那里定义方法和属性,因为两个实现都具有该属性... – hvgotcodes 2012-04-24 20:34:55

+1

fwiw,您可能想要更改抽象类名称。它不代表电话簿;它代表一个条目.... – hvgotcodes 2012-04-24 20:35:36

回答

2

你应该总是能够调用toString()任何物体上,因为这是在java.lang.Object定义的方法是所有其他类的超类。

因此,如果您覆盖Person类中的toString(),则不应该在您的Abstract类中调用它。

我不是你的问题,你在找什么做的,但这里完全确定是人的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(); 
} 
+0

这与这个问题有什么关系吗? – ControlAltDel 2012-04-24 20:40:01

+1

是的,请阅读问题的底部。 – JavaKungFu 2012-04-24 20:40:53

0

你应该添加一个getPhone方法您的抽象类(或对于这个问题的任何常用的方法,这就是接口的整点/抽象类)

public String getPhone(){ 
    return phone 
} 

,如果你需要一些特定格式的个人或企业电话覆盖该方法(或使吸气抽象的,它取决于你的要求,bu T I猜普通的老吸气是确定)

0

我认为问题的一部分,可能是概念 - 让我絮叨抽象类和这样的位。

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

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

当一个类从另一个类继承时,如果'子类' - 这里的业务或人员 - 是基类的特例 - 在这种情况下为Entry,那么最好。

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

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

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

+0

感谢rcook,这是一个很好的解释。这正是我为你提到的getDisplayName部分所做的。如果我可以给你一个向上的箭头,我想 – spaz 2012-04-24 22:03:58

+0

好吧,如果你认为它符合要求,你可以将其标记为答案。 – arcy 2012-04-25 14:15:05