2012-04-24 8 views
0

継承クラスと抽象クラスは初めてです。抽象クラスでの出力方法

この例では、人またはビジネスを持つことができる電話帳を設計しています。その人は、タイトル、名、姓、電話番号を持っています。ビジネスにはビジネス名と電話番号があります。 私は

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 抽象メソッドと抽象クラスを作成した私の2つのサブクラスは、人とビジネスです。 personのgetNameメソッドは、タイトル、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 []を持っています。私はPersonをインスタンス化する必要がないので、すべてをまとめて(whileの名前と電話番号)、toStringにアクセスすることはできません。これは混乱している場合 は申し訳ありませんが...私はこれがあるjava.lang.Objectに定義された方法であるので、あなたは常に任意のオブジェクトにtoString()を呼び出すことができるはず...

+0

抽象クラスで 'this.getPhone()'を実行できないのはなぜですか?両方の実装にそのプロパティがあるので、メソッドとプロパティを定義してください。 – hvgotcodes

+1

fwiw、抽象クラス名を変更したい場合があります。電話帳は表示されません。それはエントリを表します.... – hvgotcodes

答えて

2

を思考の私の(貧しい)電車を入力しています他のすべてのクラスのスーパークラス

PersonクラスのtoString()をオーバーライドする場合は、抽象クラスから呼び出す際に問題はありません。

私はあなたがする探しているものをあなたの質問で、正確にはわからないが、ここで人のための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

+1

はい質問の下部をお読みください。 – JavaKungFu

0

あなたは抽象クラスにgetPhoneメソッドを追加する必要があります(またはそのことについては、一般的な方法は、インタフェース/抽象クラスの全体のポイントのthats)

public String getPhone(){ 
    return phone 
} 

、あなたが人やビジネスフォンのためにいくつかの特定のフォーマットが必要な場合は、そのメソッドを上書き(またはゲッター抽象を作る。それはあなたに依存します要件、bu私は普通の古いゲッターが大丈夫だと思う)

0

私は問題の一部が概念的かもしれないと思う - 私は抽象的なクラスについて少し話を聞かせてください。

クラスの背後にあるアイデアは、システムの一部を表現することです。あなたが書いているシステムの一部である名詞で表現するものです。あなたは 'Person'と 'Business'でこれの良い例を持っています。この種のアプリケーションでは他にもさまざまな方法がありますが、これは良いスタートです。

このエントリーの別のポスターは、この場合の抽象クラスの良い候補だと思っています。電話帳の1つの「エントリー」は、ビジネスか人かのどちらかです。電話帳は「エントリー」でいっぱいになることができ、各エントリーはビジネスまたは人物のいずれかです。

あるクラスが別のクラスを継承する場合、「サブクラス」 - ここではビジネスまたはPersonが基本クラスの特別なケースである場合が最適です - この場合のエントリ。

エントリに定義されたメソッドは、エントリを反映する必要があり、そのエントリの特定のクラスに依存しません。たとえば、Entryのすべての可能なサブクラスに適用されない限り、EntryにgetFirstName()メソッドを配置するのは間違いです。私たちは通常、ビジネスをファーストネームと考えるのではないので、それはおそらく私たちが人で見つけ出す方法でしょう。

たとえば、エントリを表示する必要がある情報を返すなど、Entry内にメソッドを持たせることができます。あなたはメソッドgetDisplayName()を持つことができます。 Entryでは空のメソッドです。パラメータを取り除いてStringを返します。Personでは、最後に、最初に、真ん中など、必要なものを組み立てることができます。ビジネスでは、代わりにビジネス名を取得できます。

もう1つのポイント - 「出力」と関係があるこれらのクラスには何も配置したくありません。これらはアプリケーションの「ビジネスオブジェクト」を保持するクラスであり、すべてのフォームで出力を処理するものがあります。もちろん、デバッグのためのSystem.out.printlnステートメントには何も問題ありません。

+0

rcookさん、ありがとうございました。これはまさに私があなたが言及したgetDisplayName部分に対して行ったことです。もし私にあなたに矢印を与えてもらえれば、私はそうだ – spaz

+0

あなたはそれが適格だと思うなら、これを答えにすることができます... – arcy

関連する問題