2012-10-30 5 views
0

나는 나에게이 문제를 알려주는 오류 메시지 데 대한 정의가 포함되어 있지 않습니다."개체" "이름"

여기 내 코드입니다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace BankAccounts 
{ 
class account 
{ 
    protected string name; 
    protected float balance; 
    public account(string n, float b) 
    { 
     name = n; 
     balance = b; 
    } 

    public void deposit(float amt) 
    { 
     balance -= amt; 
    } 

    public void display() 
    { 
     Console.WriteLine("Name: {0}. Balance: {1}.", name, balance); 
    } 
} 

class savingaccount : account 
{ 
    static int accno = 1000; 
    int trans; 
    public savingaccount(string s, float b) : base(s, b) 
    { 
     trans = 0; 
     accno++; 
    } 
    public void withdraw (float amt) 
    { 
     if (trans >= 10) 
     { 
      Console.WriteLine("Number of transactions exceed 10."); 
      return; 
     } 
     if (balance - amt < 500) 
      Console.WriteLine("Below minimum balance."); 
     else 
     { 
      base.withdraw(amt); 
      trans++; 
     } 
    } 
    public void deposit(float amt) 
    { 
     if (trans >= 10) 
     { 
      Console.WriteLine("Number of transactions exceed 10."); 
      return; 
     } 
     base.deposit(amt); 
     trans++; 
    } 
    public void display() 
    { 
     Console.WriteLine("Name: {0}. Account no.: {1}. Balance: {2}", name, accno,  balance); 
    } 
} 

class currentaccount : account 
{ 
    static int accno = 1000; 
    public currentaccount(string s, float b) : base(s, b) 
    { 
     accno++; 
    } 
    public void withdraw(float amt) 
    { 
     if (balance - amt < 0) 
      Console.WriteLine("No balance in account."); 
     else 
      balance -= amt; 
    } 
    public void display() 
    { 
     Console.WriteLine("Name: {0}. Account no.: {1}. Balance: {2}.", name, accno, balance); 
    } 
} 

}

그것을 인식하지 않는 이유를 이해하지 않습니다. 클래스 saveaccount의 메소드입니다.

+1

'계정'에는'.withdraw' 메소드가 없습니다. (클래스 이름을 대문자로 표시하는 것이 가장 좋습니다.) 파생 클래스에는 기본 클래스에'.withdraw'에 대한 서명을 포함하지 않는 것이 좋습니다. ? 이 코드를 어떻게 사용하고 있는지 게시 할 수 있습니까? 오류 메시지는 내가 볼 수있는 한 정확합니다. –

+0

이 메소드들은 실제로'virtual' /'override', btw -와 같고 보통 "입금"하지 않습니다. –

답변

6
당신은 당신의 클래스 savingsaccount에서
base.withdraw(amt); 

를 호출하고

. 그러나 기본 클래스 (account)에는 그러한 메소드가 없습니다. 그래서 컴파일러는 절대적으로 정확합니다.

0

savingaccount 클래스에서 base.withdraw(amt)이라고 부르지 만 기본 클래스 account은이 방법을 정의하지 않습니다.

0

자세히 살펴보면 account 클래스에 실제로 withdraw 메소드가 없음을 알 수 있습니다.

나는 당신이 당신의 account 클래스는 다음과 같이 정의 된 가상 메서드 withdraw 포함해야 의미 추측에는 요 : 당신과 같이,이 메소드를 오버라이드 (override) 할 것입니다 귀하의 상속 클래스에서, 그리고 public virtual void withdraw(float amt) { ... }

:

class currentaccount : account 
{ 
    public override void withdraw(float amt) 
    { 
     ... 
     base.withdraw(amt) 
     ... 
    } 
    ... 
} 

또한 코드 명명 스타일의 문제가있다,하지만이 질문 :

+1

'account.withdraw'가'abstract' 인 경우'base.withdraw()'도 작동하지 않습니다. – Joey

+0

오른쪽. 나는 그것을 고쳐 줄 것이다. – MisterMetaphor

1

의 범위에 아마없는 I 귀하의 의도는 클래스의 기본 withdraw 메서드를 정의하는 것이므로 savingaccountcurrentaccount에 의해 상속됩니다. 필요한 경우 파생 클래스에 의해 재정의되도록하려면 virtual으로 선언해야합니다.

class account 
{ 
    public virtual void withdraw(float amt) 
    { 
     if (balance - amt < 0) 
      Console.WriteLine("No balance in account."); 
     else 
      balance -= amt; 
    } 
} 

currentaccount 클래스는 아마도이 상속 방법의 논리를 수정할 필요가 없다, 그래서 당신은 그것을 전부를 생략 할 수 있습니다.

public virtual void Deposit(float amt) 
{ 
    balance += amt; 
} 
public virtual void Withdraw(float amt) 
{ 
    balance -= amt; 
} 

참고 I : 당신은 단순히 기본 유형의 방법을 놓친처럼

class savingaccount : account 
{ 
    public override void withdraw(float amt) 
    { 
     if (trans >= 10) 
     { 
      Console.WriteLine("Number of transactions exceed 10."); 
      return; 
     } 
     if (balance - amt < 500) 
      Console.WriteLine("Below minimum balance."); 
     else 
     { 
      base.withdraw(amt); 
      trans++; 
     } 
    } 
} 
4

것 같습니다 : 반면에, 당신의 savingaccount 클래스에서, 당신은 사용자 정의 동작을 구현하는 방법을 대체 할 수 있습니다 "보증금"을 +=으로 변경하고, virtual 메소드를 작성하여 하위 클래스가 override 메소드를 사용할 수 있도록했습니다. 이는 의도가 무엇인지 여기에 있습니다. 또한 float은 돈을 저축하기에 정말 나쁜 선택입니다. decimal이 더 나은 선택 일 수 있습니다. 문체가 바뀌면서 이름을 대문자로 사용했습니다.

0

누구나 이미 allready를 지적 했으므로 기본 클래스 acocunt에서 withdraw() 메서드를 선언해야합니다. 따라서 파생 클래스가 모두이 메서드를 상속받을 수 있습니다.