2012-04-24 2 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. В основном я создал массив 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 []. Я думал, что мне нужно toString в Person, чтобы собрать все вместе (имя и номер телефона), но затем в основном я не могу получить доступ к этому toString, потому что у меня нет экземпляра Person? Извините, если это сбивает с толку ... Я просто набрав мой (плохой) ход мыслей ...

+0

Почему вы не можете сделать 'this.getPhone()' в абстрактном классе? Просто определите метод и свойство там, так как обе реализации имеют это свойство ... – hvgotcodes

+1

fwiw, вы можете захотеть изменить свое абстрактное имя класса. Он не представляет собой телефонную книгу; он представляет собой запись .... – hvgotcodes

ответ

2

Вы всегда должны быть в состоянии назвать toString() на любом объекте, потому что это метод, определенный на java.lang.Object, который суперкласс всех других классов.

Так что, если вы переопределяете toString() на своем классе 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(); 
} 
+0

это не имеет ничего общего с вопросом? – ControlAltDel

+1

Да, пожалуйста, прочитайте нижнюю часть вопроса. – JavaKungFu

0

вы должны добавить метод getPhone к вашему абстрактному классу (или любой общий метод по этому вопросу, вот весь смысл интерфейсов/абстрактные классы)

public String getPhone(){ 
    return phone 
} 

и если вам нужен какой-то определенный формат для человека или бизнес-телефоны перезаписать этот метод (или сделать геттер реферат. Это зависит от вашего требования, bu я думаю, простой старый геттер в порядке)

0

Я думаю, что часть проблемы может быть концептуальной - позвольте мне немного рассказать об абстрактных классах и т. д.

Идея любого класса состоит в том, чтобы представлять часть вашей системы - то, что вы представляете, с существительным, которое является частью системы, которую вы пишете. У вас есть хорошие примеры этого в «Человеке» и «Бизнесе»; есть другие способы сделать что-то в этом виде приложения, но это хорошее начало.

Другой плакат упоминает «Вступление», который, я думаю, является хорошим кандидатом для абстрактного класса в этом случае - одна «запись» в телефонной книге может быть либо бизнесом, либо человеком; поэтому телефонная книга может быть заполнена «записями», и каждая запись является либо бизнесом, либо человеком.

Когда один класс наследуется от другого, лучше всего, если «подкласс» - бизнес или человек здесь - это особый случай базового класса - запись в этом случае.

Методы, определенные в записи, должны отражать записи и не зависят от конкретного класса в этой записи. Например, было бы ошибкой поместить метод getFirstName() в Entry, если это не применимо ко всем возможным подклассам Entry. Поскольку мы обычно не думаем о том, что бизнес имеет имя, это, вероятно, метод, который мы найдем только в Person.

Таким образом, вы можете иметь методы в Entry, которые могут, например, возвращать информацию, необходимую для отображения записи. У вас может быть метод getDisplayName(); в Entry это пустой метод, просто определяющий, что он не принимает параметров и возвращает String, в Person он может складываться последним, первым, средним или любым другим, что вы хотели; в бизнесе он может получить название компании.

Еще один момент - вы не хотите ничего вкладывать в какой-либо из этих классов, который имеет отношение к «выходу»; это классы, которые содержат «бизнес-объекты» вашего приложения, у вас были бы другие, которые занимались бы выпуском во всех его формах. Конечно, нет ничего плохого в операциях System.out.println для отладки.

+0

Спасибо, rcook, что было хорошим объяснением. Это именно то, что я сделал для части getDisplayName, о которой вы говорили. Если бы я мог дать вам стрелку вверх, я бы сделал – spaz

+0

Ну, вы могли бы отметить это как ответ, если считаете, что это соответствует ... – arcy