2012-04-24 4 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에 어떻게 액세스합니까? 이것은 (I는 현재 개인 부분에서 일하고 있어요) 내가 쉽게 내가 있기 때문에 액세스 할 수 있습니다

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 주입니다

전화 번호부 []. 나는 사람을 인스턴스화하지 않았기 때문에 모든 것을 함께 정리하기 위해 (to name과 전화 번호) toString을 필요로한다고 생각했지만 그 다음에는 toString에 액세스 할 수 없다. 이 혼란 경우 죄송합니다 ... 난 그냥 생각의 내 (가난한) 기차 ... 당신은 항상 모든 객체에 toString()를 호출 할 수 있어야한다

+0

왜 추상 클래스에서'this.getPhone()'을 할 수 없습니까? 두 개의 구현 모두 해당 속성을 가지고 있기 때문에 메소드와 속성을 정의하십시오. – hvgotcodes

+1

fwiw, 추상 클래스 이름을 변경하고자 할 수 있습니다. 전화 번호부는 아닙니다. 그것은 항목을 나타냅니다 .... – hvgotcodes

답변

2

을 입력하고있어입니다 java.lang.Object에 정의 된 방법이기 때문에 다른 클래스의 슈퍼 클래스

Person 클래스의 toString()을 덮어 쓰면 Abstract 클래스에서 호출하는 데 문제가 없어야합니다.

@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 방법을 추가 (또는한다 : 당신이 여기에서 찾고 있지만 무엇 귀하의 질문에 의해 정확히 모르겠어요

는 사람의를 toString 구현의 예입니다 그 문제에 대한 모든 일반적인 방법은, 인터페이스의 요점/추상 클래스)

public String getPhone(){ 
    return phone 
} 

및 개인 또는 비즈니스 전화가 그 방법을 덮어 (또는 게터 초록을 위해 당신은 어떤 특정 형식을 필요로하는 경우. 그것은 당신에 따라 달라집니다 이잖아 요구 사항, 부 평범한 오래된 게터가 괜찮은 것 같아요)

0

저는 문제의 일부가 개념적이라고 생각합니다.

모든 클래스의이면에있는 아이디어는 시스템의 일부를 표현하는 것입니다. 시스템의 일부인 명사로 표현할 수 있습니다. 당신은 'Person'과 'Business'에서이 좋은 예를 가지고 있습니다. 이런 종류의 응용 프로그램에서 일을하는 다른 방법이 있지만 이것은 좋은 출발입니다.

"Entry"라고하는 다른 포스터는이 경우 추상적 클래스에 대한 좋은 후보라고 생각합니다. 전화 번호부에있는 '항목'은 비즈니스 또는 사람이 될 수 있습니다. 따라서 전화 번호부는 "항목"으로 가득 할 수 있으며 각 항목은 회사 또는 사람 중 하나입니다.

한 클래스가 다른 클래스를 상속하는 경우 '하위 클래스'- 여기서 비즈니스 또는 사람 -이 기본 클래스의 특수한 경우 -이 경우 항목입니다.

항목에 정의 된 메소드는 항목을 반영해야하며 해당 항목의 특정 클래스에 의존하지 않아야합니다. 예를 들어 Entry의 가능한 모든 하위 클래스에 적용되지 않는 한 getFirstName() 메서드를 Entry에 두는 것은 실수입니다. 우리는 일반적으로 사업을 이름이있는 것으로 생각하지 않기 때문에 아마도 그 방법은 사람 에게서만 찾을 수 있습니다.

예를 들어 항목을 표시하는 데 필요한 정보를 반환 할 수있는 Entry의 메서드를 사용할 수 있습니다. 당신은 getDisplayName() 메소드를 가질 수 있습니다; Entry에서는 빈 메서드입니다. 매개 변수를 사용하지 않고 String을 반환한다는 것을 정의합니다. Person에서 마지막으로, 처음으로, 중간으로 또는 원하는대로 지정할 수 있습니다. 비즈니스에서는 대신 비즈니스 이름을 얻을 수 있습니다.

"출력"과 관련이있는 클래스에는 아무 것도 넣지 않으려 고합니다. 이 클래스는 애플리케이션의 '비즈니스 객체'를 보유하는 클래스이며, 모든 형태로 출력을 처리하는 다른 클래스가 있습니다. 물론 디버깅을위한 System.out.println 문에는 아무런 문제가 없습니다.

+0

좋은 설명이었던 rcook에게 감사드립니다. 그게 당신이 언급 한 getDisplayName 부분에서했던 것입니다. 내가 너에게 화살을 줄 수 있었다면, 나는 그럴거야 – spaz

+0

자네가 이걸 자격으로 생각한다면 대답으로 표시 할 수 있겠지. – arcy

관련 문제