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();

}

私の2つのサブクラスは、PersonとBusinessです。その人のgetNameメソッドは、タイトル、f名、l名を連結します。主に、個人またはビジネスの両方を保持できる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 []があるので、簡単にアクセスできます。すべてをまとめるにはtoStringinPersonが必要だと思っていましたが(while名と電話番号)、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、または必要なものを組み合わせることができます。ビジネスでは、代わりにビジネス名を取得できます。

もう 1 点 - これらのクラスには、「出力」に関係するものは何も入れないでください。これらはアプリケーションの「ビジネス オブジェクト」を保持するクラスであり、すべての形式の出力を処理する他のクラスがあります。もちろん、デバッグ用の System.out.println ステートメントに問題はありません。

于 2012-04-24T21:37:06.580 に答える
0

抽象クラスにメソッドを追加する必要がありgetPhoneます(または、その点で一般的なメソッド、それがインターフェース/抽象クラスの要点です)

public String getPhone(){
    return phone
}

個人用またはビジネス用の電話に特定の形式が必要な場合は、そのメソッドを上書きします (またはゲッターを抽象化します。要件によって異なりますが、普通の古いゲッターで問題ないと思います)。

于 2012-04-24T21:06:09.907 に答える