0

これに関する投稿が他にもある場合は、事前にお詫び申し上げます。関連があると思われる投稿を調べましたが、解決策が見つかりませんでした。私はパーソンテスターと呼ばれるプロジェクトに取り組んでいます。

  1. ユーザーは、顧客 (c) を作成するか、従業員 (e) を作成するかを選択するよう求められます。
  2. 次に、ユーザーは姓名、電子メール アドレス、および顧客番号 (顧客が選択されている場合) または社会保障番号 (従業員が選択されている場合) のいずれかを入力するように求められます。

  3. 正しいデータが収集されると、情報は次の形式でコンソールに出力されます。

        name: first last
        email: jondoe@fakemail.com
        social security number: XXXXXXXXXXX (if employee)
        customer number: XXXXXX  (if customer)
    
  4. このプログラムは、従業員クラスと顧客クラスによって拡張される継承と抽象人物クラスを扱います。別の規定では、person クラスには、文字列を返す getDisplayText という名前の抽象メソッドを含める必要があります。

これが私の問題があるところです。抽象クラスを扱うのはこれが初めてです。

私の質問は、入力されたすべてのユーザーデータを表示するために perosn クラスの toString メソッドを単純に出力して、次の問題に持ち込むことができない理由です。プログラムには追加のコンポーネントが必要です (そして、割り当てから引用します)。 :オブジェクトのデータをコンソールに出力するには、このアプリケーションで Person オブジェクトを受け入れる print という名前の静的メソッドを使用する必要があります。

クラスで議論されたことがないので、これを実装する方法がわかりません。System.out.print(aPerson.toString) を単純にコーディングしようとしましたが、 Name: と Social Security number: の空白の値しか得られません。私はこれに数時間取り組んでおり、関連するテキストを少なくとも4回読み直しています。これが私の最後の手段であります。私を正しい方向に導いてください。これを正しく行うために長時間働いてもかまいません。

私はアプリケーションの大部分を書き終えましたが、今はデータをコンソールに出力する方法に固執しています。すべての提案を歓迎します。これが私のコードです:

public class CH08PR82App {
    public static void main(String[] args) {
        System.out.print("Welcome to the Person Tester Application");
        System.out.println();

        Scanner sc = new Scanner(System.in);

        Person aPerson;
        aPerson = new Person();

        if (aPerson != null) {
            System.out.println(aPerson.toString());
        }

        String choice = "y";
        while (choice.equalsIgnoreCase("y")) {

            //prompt user to enter customer or employee
            System.out.print("Create customer or employee (c/e): ");
            String userType = sc.nextLine();

            if (userType.equalsIgnoreCase("c")) {
                String firstName = Validator.getStringInput(sc, "Enter first name: ");
                String lastName = Validator.getStringInput(sc, "Enter last name: ");
                String email = Validator.getStringInput(sc, "Enter email address: ");
                String custNumber = Validator.getStringInput(sc, "Customer number: ");
                //System.out.println(custNumber);
            } else if (userType.equalsIgnoreCase("e")) {
                String firstName = Validator.getStringInput(sc, "Enter first name: ");
                String lastName = Validator.getStringInput(sc, "Enter last name: ");
                String email = Validator.getStringInput(sc, "Enter email address: ");
                int empSoc = Validator.getInt(sc, "Social security number: ");
            }
            choice = Validator.getStringContinue(sc, "Continue? (y/n): ");
        }
    }
}

abstract class Person {

    private String firstName;
    private String lastName;
    private String eMail;

    public Person() {
        firstName = "";
        lastName = "";
        eMail = "";
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String geteMail() {
        return eMail;
    }

    public void seteMail(String eMail) {
        this.eMail = eMail;
    }

    @Override
    public String toString() {
        return "Name: " + this.firstName + this.lastName + "\n" + "E-mail: "
                + this.eMail;
    }

    abstract String getDisplayText();
}

abstract class Customer extends Person {

    private String customerNumber;

    public Customer() {
        super.toString();
        customerNumber = "";
    }

    public void setcustomerNumber(String customerNumber) {
        this.customerNumber = customerNumber;
    }

    public String getcustomerNumber() {
        return customerNumber;
    }

    @Override
    public String toString() {
        return super.toString() + "Social Security number: " + customerNumber
                + "\n";
    }
}

abstract class Employee extends Person {

    private String socNumber;

    public Employee() {
        super.toString();
        socNumber = "";
    }

    public void setsocNumber(String socNumber) {
        this.socNumber = socNumber;
    }

    public String getsocNumber() {
        return socNumber;
    }

    @Override
    public String toString() {
        return super.toString() + "Social Security number:      " + socNumber
                + "\n";
    }
}

class Validator {
    public static String getStringContinue(Scanner sc, String prompt) {
        boolean isValid = false;
        String s = "";
        while (isValid == false) {
            System.out.print(prompt);
            if (sc.hasNext("y")) {
                s = sc.nextLine(); // read entire line
                isValid = true;
            } else if (sc.hasNext("n")) {
                s = sc.nextLine();
                isValid = true;
            } else {
                s = sc.nextLine();
                isValid = false;
                System.out.println("Error! Invalid string value. Try again.");
            }
        }
        return s;
    }

    public static String getStringInput(Scanner sc, String prompt) {
        boolean isValid = false;
        String s = "";
        while (isValid == false) {
            System.out.print(prompt);
            if (sc.hasNext()) {
                s = sc.nextLine(); // read entire line
                isValid = true;
            } else {
                System.out.println("Error! Invalid string value. Try again.");
            }
        }
        return s;
    }

    public static int getInt(Scanner sc, String prompt) {
        int i = 0;
        boolean isValid = false;
        while (isValid == false) {
            System.out.print(prompt);
            if (sc.hasNextInt()) {
                i = sc.nextInt();
                isValid = true;
            } else {
                System.out.println("Error! Invalid integer value. Try again.");
            }
            sc.nextLine(); // discard any other data entered on the line
        }
        return i;
    }

    public static int getInt(Scanner sc, String prompt, int min, int max) {
        int i = 0;
        boolean isValid = false;
        while (isValid == false) {
            i = getInt(sc, prompt);
            if (i <= min) {
                System.out.println("Error! Number must be greater than " + min
                        + ".");
            } else if (i >= max) {
                System.out.println("Error! Number must be less than " + max
                        + ".");
            } else {
                isValid = true;
            }
        }
        return i;
    }

    public static double getDouble(Scanner sc, String prompt) {
        double d = 0;
        boolean isValid = false;
        while (isValid == false) {
            System.out.print(prompt);
            if (sc.hasNextDouble()) {
                d = sc.nextDouble();
                isValid = true;
            } else {
                System.out.println("Error! Invalid decimal value. Try again.");
            }
            sc.nextLine(); // discard any other data entered on the line
        }
        return d;
    }

    public static double getDouble(Scanner sc, String prompt, double min,
            double max) {
        double d = 0;
        boolean isValid = false;
        while (isValid == false) {
            d = getDouble(sc, prompt);
            if (d <= min) {
                System.out.println("Error! Number must be greater than " + min
                        + ".");
            } else if (d >= max) {
                System.out.println("Error! Number must be less than " + max
                        + ".");
            } else {
                isValid = true;
            }
        }
        return d;
    }
}
4

1 に答える 1

0

まず、print メソッドを見てみましょう。

public static void print(Person person) {
    System.out.println(person.toString());
}

次に、Person クラスに抽象メソッドが必要です。

public abstract String getDisplayText(Person person);

Employee クラスと Customer クラスでオーバーライドするもの:

// Employee
@Override
public String getDisplayText(Person person) {
    return ((Employee)person).toString();
}

と:

// Customer
@Override
public String getDisplayText(Person person) {
    return ((Customer)person).toString();
}

それぞれの実装が異なるため、メソッドを抽象化する必要がありました。Customer には顧客 ID があり、Employee には Soc Number があります。

次に、静的メソッドと抽象メソッドについて説明します。静的メソッドと抽象メソッドの違いは、抽象メソッドが単なるヘッダーであることです。実装は子クラスにあります。一方、静的メソッドは、最初にオブジェクトを作成せずに呼び出すことができることを意味します。

この特定の静的メソッドの使用法は非常に簡単です。あなたが持っているとしましょう:

Person john = new Customer();
... // Fill john with data
Person.print(john);

また、この抽象的で静的なものすべてについて少し混乱しているようにも見えます。抽象クラスは、オブジェクトを作成できないクラスです。あなたの例では、抽象クラス Person があります。顧客または従業員 (どちらも人であるため、Person クラスからの継承) が必要なため、このクラスは抽象的ですが、これらのいずれでもない人に関する情報を保存したくない場合。そして、それがあなたができない理由でもあります:

Person john = new Person(); // Build error

しかし、あなたはすることができます(そしてすべきです):

Person john = new Employee(); // Will compile and run
于 2013-02-16T20:47:45.510 に答える