2010-12-31 8 views
1

지난 며칠간 Java 클래스를 실험 해 보았습니다. youtube의 TheNewBoston과 java 문서에서 학습했습니다.기본 및 하위 클래스 생성자 문제

나는 다음과 같은 시나리오를 만들었고, 내가 가진 몇 가지 질문에 대한 여러분의 (여자도) 전문적인 비판과 깊이있는 지식을 찾습니다.

person 클래스와 person_financial 클래스는 각각 기본 클래스와 하위 클래스입니다.

사람 클래스 :

public class person { 

private String name; 
private String sex; 
private int age; 
private double height; 
private double weight; 
private double intelligence; 

// person constructor arguments order: name, height, weight, age, sex, intelligence 
public person(){ 
    this("noname",0,0,0,"undefined",5); 
} 
public person(String n){ 
    this(n,0,0,0,"undefined",5); 
} 
public person(String n, double h){ 
    this(n,h,0,0,"undefined",5); 
} 
public person(String n, double h, double w){ 
    this(n,h,w,0,"undefined",5); 
} 
public person(String n, double h, double w, int a){ 
    this(n,h,w,a,"undefined",5); 
} 
public person(String n, double h, double w, int a, String s){ 
    this(n, h, w, a, filterSex(s), 5); 
} 
public person(String n, double h, double w, int a, String s, double i){ 
    name = n; 
    height = h; 
    weight = w; 
    age = a; 
    sex = filterSex(s); 
    intelligence = i; 
} 

public void setName(String n){ 
    name = n; 
} 
public void setHeight(double h){ 
    height = h; 
} 
public void setWeight(double w){ 
    weight = w; 
} 
public void setAge(int a){ 
    age = a; 
} 
public void setSex(String s){ 
    sex = filterSex(s); 
} 
public void setIntel(double i){ 
    intelligence = i; 
} 

public String getName(){ 
    return name; 
} 
public double getHeight(){ 
    return height; 
} 
public double getWeight(){ 
    return weight; 
} 
public int getAge(){ 
    return age; 
} 
public String getSex(){ 
    return sex; 
} 
public double getIntel(){ 
    return intelligence; 
} 

public String getInfo(){ 
    return String.format("Name: %s,\nSex: %s,\nAge: %d,\nIntelligence: %.2f," 
      + "\nHeight: %.2f,\nWeight: %.2f\n", name, sex, age, 
      intelligence, height, weight); 
} 

private static String filterSex(String s){ 
    return ((s.equalsIgnoreCase("male") || 
      s.equalsIgnoreCase("female")) ? s : "undefined"); 
} 
} 

person_financial 클래스 :

public class person_financial extends person { 

private double monies = 0; 

public void definePerson(String n, int a, String s, double i, double h, double w){ 
    setName(n); 
    setAge(a); 
    setSex(s); 
    setIntel(i); 
    setHeight(h); 
    setWeight(w); 
} 

public person_financial() { 
    this(0); 
} 

public person_financial(double m) { 
    monies = m; 
} 

public void depositMonies(double m) { 
    monies += m; 
} 

public void withdrawlMonies(double m) { 
    if (m <= monies) { 
     monies -= m; 
    } 
} 

public double getBalance() { 
    return monies; 
} 
} 

다음 메인 클래스에서 내가 한 다음 person_financial 클래스

public class Main { 

public static void main(String[] args) { 

    person p1 = new person("I have no Name", 180, 72, 38, "Alien", 7.2); 
    System.out.println(p1.getName()); 


    person_financial pf1 = new person_financial(100.00); 
    pf1.depositMonies(50.02); 
    System.out.printf("%s has %.2f monies.\n", pf1.getName(), pf1.getBalance()); 

    pf1.definePerson("some_name", 42, "male", 10, 180, 72); 
    System.out.println(pf1.getInfo()); 
} 
} 

, 내가 만든 가지고 그렇지 않으면 def 였을 모든 특성을 정의하는 데 사용하는 "definePerson()"이라는 메서드 'person'클래스의 'person()'생성자에서 가져온 것입니다. 하위 클래스의 기본 클래스에있는 변수에 값을 할당하는 데 더 전문적인 방법이있을 것이라고 확신합니다. 그 중 일부는 알지 못합니다. ...

또한 생성자를 " person '클래스를 사용하여'pf1 '에 대한 특성을 정의 할 수 있습니까? 예를 들어, 수동으로 각 속성 (예 : pf1.setName ("something"))을 설정하지 않아도됩니다. , 또는 pf1.setAge (1000000); 등 ... 또는 'definePerson()'에서와 같이 메서드를 사용하면됩니다.

아무런 도움이되지 않으므로, 감사합니다.).

답변

5

super() 호출을 사용하여 상위 클래스의 생성자를 호출합니다. 파생 클래스의 생성자에서 첫 번째 호출이되어야하지만 다른 함수와 마찬가지로 호출 (및 인수 전달)하면 해당 방법으로 생성자를 호출합니다.

+2

감사합니다. 서브 클래스의 생성자에 "super ()"를 추가했습니다. – Inventor22

0

일반적인 객체 생성을 막기 위해 '추상'클래스를 선언하는 것이 일반적입니다. 맨 아래에있는 사용 코드를 기반으로하고 싶지는 않지만 괜찮습니다. 그냥 클래스 추상을 선언 할 수 있다는 것을 기억하십시오.

클래스 계층 구조를 사용하는 가장 좋은 방법은 유용한 계층 구조의 모든 클래스를 계층 구조의 anythin으로 선언 할 수 있도록해야한다는 것입니다 (즉, 기본 객체에서 구체적인 객체의 메소드에 액세스 할 수 있어야 함) -class (이 경우 사람)

귀하의 financial_person 개체는 사람을 확장하지만, 이상적인 수준으로 선언하고 메소드를 다형성으로 호출 할 수있는 클래스를 갖는 것이 이상적입니다. 모든 사람들이 무승부 및 예금 (수업과는 다르지만 잠시 나와 함께)

drawMoney 메소드는 직접 존재할 수 있지만 추상으로 표시되어 하위 클라스를 강요합니다. 012_smoney, deposit_money 등을 구현하기 위해 financial_person과 regular_person을 사용합니다.

각 클래스는 현실에 적합합니다 (금융 인은 모든 종류의 특별 계정, 할인 등에 액세스 할 수 있습니다. 그리고 regular_person은 -하지만 여전히 같은 외부 행동).

그럼 당신은 다음과 같이 선언 할 수 :

Person finPerson = new FinancialPerson(... etc.); 
Person regPerson = new RegularPerson(....etc); 

메모를 지금 아래 코드를 할 수 있다는 :

finPerson.drawCash(12300.0); 
regperson.drawCase(100.0); 

동일한 동작을.

수천명의 사람 목록을 가질 수 있으며 if-then-else를 수행하거나 명령문을 전환하여 각각의 미세 조정 된 동작을 실행할 필요가 없습니다.

클래스 계층 구조에 대한 산성 테스트는 다음과 같습니다. "내 (하위 클래스)는 실제로 '일종의 (수퍼 클래스)입니까?"

즉, "내 하위 클래스가 수퍼 클래스의 동작을 갖고 있습니까?"

그렇지 않으면 클래스 계층 구조에 대해 신중하게 생각해야합니다. Liskov Substitution Principle의 약어로 Robert의 것보다 더 나은 작업을 수행 할 수 없습니다. C. 마틴 - 중 하나 소프트웨어 설계 전문가 :이 기사에서는

http://www.objectmentor.com/resources/articles/lsp.pdf

그는 당신이 권할 계층 구조를 가지고 예를은 "사각형 종류-의를 사각형을한다"사용하여 무슨 일을 보여줍니다.

Google은 상속을 효과적으로 사용하는 또 다른 측면의 요약을 위해 "템플릿 방법 패턴"을 제공합니다. 대부분의 사람들이 그것을 단순한 유산으로 생각하는 단순한 유산보다 훨씬 강력하다는 것을 알 수 있습니다.

또한 모든 패턴에 단일 패턴이 없다는 것을 기억하십시오. 어떤 사람들은 클래스 계층 구조의 악을 호출하여 인터페이스 만 사용하도록 지시합니다. 다른 사람들은 그 반대라고 말할 것입니다. 할 수있는 선택이 있으며 때로는 분명하지 않습니다.

많은 함정이 있으며 누락 된 LSP는 그 중 하나입니다. (예 : equals/hashcode 등에서 사용되는 필드와 같은) "식별"필드의 변경 가능성을 가능케하는 구체적인 클래스를 갖는 구체적인 클래스를 갖는 구체적인 메소드를 오버 라이딩하는 (예제 만). 은행의 "customer"객체가 first-name 재설정을 허용한다고 상상해보십시오. , 또는 계좌 번호)를 입력하십시오.

내 대답은 일반적으로 특정 코딩 질문보다 객체 지향 디자인, 상속 등과 관련되어 있습니다. 여러분에게 도움이되기를 바랍니다.

관련 문제