2017-01-03 5 views
3

나는 수퍼 클래스 인 BankAccount (추상 정의 됨) 클래스와 SavingsAccount 및 CheckingAccount라는 두 개의 하위 클래스를 가지고 있습니다.메소드가 수퍼 클래스에 정의되어있는 경우,이를 호출하는 객체에 따라 결과를 변경하는 방법

둘 다 BankAccount에 정의 된 withdraw 메소드를 사용하지만 CheckingAccount는 초과 저장 될 수 있습니다.

내 상담자는 BankAccount의 생성자에서 우리는 다음과 같은 포함 된 경우이다 :로하여 SavingsAccount 클래스에서 호출 할 수

public BankAccount(double balanceIn, double withdrawIn) 
    { 
     balance = balanceIn; 
     withdraw = withdrawIn; 
    } 

:

public SavingsAccount(double balanceIn, double withdrawIn) 
    { 
    // initialise instance variables 
    super (balanceIn, withdrawIn); 

    } 

를 변경하는 방법이 어떻게 메서드는 CheckingAccount 클래스 또는 SavingsAccount 클래스에서 생성자를 호출하는지 여부에 따라 응답합니다.

예 (이것은 단지 명료하고 rea가 아닙니다. L 코드는, 그러나 방법이 있기 때문에 당신이 그것을 그래서 자식 클래스에서 슈퍼 클래스의 매개 변수를 재정의 할 수 없습니다 발견 몇 가지 조사 후 기본적으로이 작업을 수행하는 BankAccount가 클래스)

public void setWithdraw(double withdrawIn) 
{ 
    withdraw = withdrawIn; 


    if (withdrawIn is called from savingsAccount && balance < withdrawIn) 
    { 
     System.out.print("You have insufficient funds"); 
    } 
    else 
    { 
     balance = balance - withdrawIn; 
     System.out.print("Funds Withdrawn"); 
    } 
} 

나는이 부탁 해요 정의 이것이 어떻게 행해졌는지 궁금해했다. SavingsAccount 클래스는 고유 한 속성 등을 가지므로 명확성을 위해 그 속성을 남겨 두었습니다 (경우에 따라 궁금합니다).

CheckingAccount에 인출 방법을 넣고 SavingsAccount에 또 다른 인출 방법을 넣는 것이 훨씬 더 간단 할 것입니다. 그러나 둘 다 자금을 인출했기 때문에 수퍼 클래스에 넣을 수 있는지보고 싶었습니다.

+0

'this instanceof SavingsAccount'와 같은 것을 시도하고 있습니까? –

+3

부모 클래스는 자녀에 관해서는 알지 못합니다. –

+0

왜 계정 생성자에서 돈을 인출하려고합니까? –

답변

2

당신은 방법의 재정의를 사용할 수 있습니다

public class BankAccount { 
    public BankAccount(double balanceIn, double withdrawIn) { 
    balance = balanceIn; 
    setWithdrawn(withdrawIn); 
    } 

    protected void setWithdrawn(double withdrawIn) { 
    // do the base stuff like withdraw = withdrawIn; 
    } 
} 

그리고 두 번째 클래스 :

public class SavingsAccount extends BankAccount { 
    public BankAccount(double balanceIn, double withdrawIn) { 
    super(balanceIn, withdrawIn); 
    } 

    // overwrite setWithdrawn 
    @Override 
    protected void setWithdrawn(double withdrawIn) { 
    // do the specific stuff like the code of setWithdrawn in your post 
    } 
} 
+0

이것은 내가 찾던 정확한 대답이었습니다, 감사합니다! –

2

네,하지만 그것은 일종의 해키. 그리고 어쨌든해서는 안됩니다. 오후 77 시절 그의 코멘트에서 "부모님은 자녀들에 관해서는 아무것도 모르는 것이 좋다"고 말했다. 진정한 ODD 솔루션으로 더 나아질 수 있습니다.

하위 클래스에 고유 한 모든 동작은 해당 하위 클래스에 있어야합니다. 하위 클래스 (있는 경우)간에 공유되는 모든 동작은 수퍼 클래스에 있어야합니다. 서브 클래스간에 (메소드 서명 이외의) 동작이 공유되지 않는 경우, 수퍼 클래스는 interface 또는 abstract이어야합니다.

는 당신이 필요로 다음 중 하나입니다

  1. 는 슈퍼 클래스의 메소드를 선언하지만, 서브 클래스를 정의합니다.
    수퍼 클래스를 interface 또는 abstract (또는 그 중 하나의 메소드를 abstract으로 만드는 것)으로 정의한 다음 서브 클래스의 메소드를 재정 의하여 정의 할 수 있습니다. 이 접근 방식은 각 하위 클래스에 메서드 (이 아키텍처에 대한 OOD 계약)가 있음을 보장하지만 그 동작은 하위 클래스에 고유합니다. 이 접근 방식은 수퍼 클래스가 직접 인스턴스화되지 않는 경우에 적합합니다 (하위 클래스 만 해당).
  2. 수퍼 클래스에서 공유 동작을 적용하고 각 서브 클래스에서 고유 한 동작을 적용합니다. 하위 클래스 '메소드가 상위 클래스'메소드를 호출하여 공유 동작을 가져온 후 하위 클래스 메소드에서 직접 고유 한 동작을 나중에 실행하십시오. 수퍼 클래스 메서드에 액세스하려면 super을 사용하십시오 (this과 유사한 구문 사용). 이 접근법은 공유 기능을 모듈화하는 이점이 있지만 각 하위 클래스가 메소드에 고유 한 동작을 추가 할 수있게합니다. 이 방법은 생성자에게 가장 적합하지만 모든 방법과 함께 사용할 수 있습니다.
  3. 하위 클래스의 메서드를 재정의합니다. 즉, 서브 클래스에서 완전히 다른 서명을 가진 메소드를 정의하십시오. 서브 클래스의 메소드는 "슈퍼 클래스"메소드를 "오버라이드 (override)"할 것이므로 각 서브 클래스에 고유 한 동작을 지정할 수 있습니다. 이 접근 방식은 수퍼 클래스가 여전히 직접 인스턴스화되고 메소드가 호출되도록 허용하는 이점이 있습니다. 또한 각 서브 클래스가 고유 한 동작을 가질 수 있습니다. 이 방법은 비 생성자 메서드에 적합합니다.
+0

감사합니다. 매우 유용하다고 생각합니다. –