2014-04-26 49 views
0

我遇到以下代码的问题。我缺少使用指令或程序集引用?

class AccountDB 
{ 
    public void DumpCustomers(TextWriter textWriter) 
    { 
     foreach (Customer c in _Customers) 
     { 
      textWriter.WriteLine("\t{0}", c); 
      foreach (Account a in c.Accounts) 
      { 
       textWriter.WriteLine("\t\t{0}", a.AccountType); 
       textWriter.WriteLine("\t\t\t{0,-20} : {1,13}", "Opening Balance", a.OpeningBalanceString); 
       foreach (ITransaction t in a.Transactions) 
        textWriter.WriteLine("\t\t\t{0,-20} : {1,13}", t.Description, t); 
       textWriter.WriteLine("\t\t\t{0,-20} : {1,13}", "Closing Balance", a); 
      } 
     } 
    } 
} 


class SavingsAccount : Account 
{ 
    public string AccountType 
    { 
     get { return "Savings Account"; } 
    } 
} 

class CreditAccount : Account 
{ 
    public string AccountType 
    { 
     get { return "Credit Account"; } 
    } 
} 

class Customer 
{ 
    private string _Name; 
    private List<Account> _Accounts = new List<Account>(); 

    public string Name 
    { 
     get { return _Name; } 
    } 

    public ReadOnlyCollection<Account> Accounts 
    { 
     get { return _Accounts.AsReadOnly(); } 
    } 

    public Customer(string Name) 
    { 
     _Name = Name; 
    } 

    public void AddAccount(Account account) 
    { 
     if (!_Accounts.Contains(account)) 
     { 
      _Accounts.Add(account); 
      account.RecordCustomer(this); 
     } 
    } 

    public override string ToString() 
    { 
     return _Name; 
    } 
} 

当编译器试图访问ACCOUNTTYPE字符串,我得到以下错误:

'Example_Namespace.Account' does not contain a definition for 'AccountType' and no extension method 'AccountType' accepting a first argument of type 'Example_Namespace.Account' could be found (are you missing a using directive or an assembly reference?)

我理解的东西必须添加到Account类允许代码运行(可能是多态),但我不确定如何进一步进行。我将不胜感激任何帮助。谢谢:)

+0

向我们展示了Customer类?它可能引用Account类,但Account类没有AccountType属性,它的子类有。 –

+0

我只是把它放在:) – SuperDicko

+0

这是在同一个命名空间'Example_Namespace'? – paqogomez

回答

2

您应该将AccountType属性添加到Account类。有两种方法:

使账户类摘要:

abstract class Account 
{ 
    public abstract string AccountType { get; } 
} 

class SavingsAccount : Account 
{ 
    public override string AccountType 
    { 
     get { return "Savings Account"; } 
    } 
} 

class CreditAccount : Account 
{ 
    public override string AccountType 
    { 
     get { return "Credit Account"; } 
    } 
} 

或作出ACCOUNTTYPE财产虚拟:

class Account 
{ 
    public virtual string AccountType { get { return string.Empty; } } 
} 

class SavingsAccount : Account 
{ 
    public override string AccountType 
    { 
     get { return "Savings Account"; } 
    } 
} 

class CreditAccount : Account 
{ 
    public override string AccountType 
    { 
     get { return "Credit Account"; } 
    } 
} 

这将使意义,如果帐户应该对自己被实例化,并能提供AccountType属性的有效实现。否则,你应该去抽象类。

0

嗯,你写道:

foreach (Account a in c.Accounts) 
{ 
textWriter.WriteLine("\t\t{0}", a.AccountType); 
... 
} 

的问题是,你已经在SavingsAccountCreditAccount,从账户类继承的类中定义的ACCOUNTTYPE财产。

错误发生时ac.Accounts不是一个SavingsAccountCreditAccount

该解决方案将被加入(虚拟)ACCOUNTTYPE属性为帐户类,并在子类覆盖它。

0

这里:

foreach (Account a in c.Accounts) 

你正在一个帐户类型。

这里你说的是储蓄账户实现账户。

class SavingsAccount : Account 
{ 
    public string AccountType 
    { 
     get { return "Savings Account"; } 
    } 
} 

SavingAccount是AccountType不在Account中的地方。您的基本类帐户需要如此。

public abstract class Account 
{ 
    public abstract string AccountType { get; } 
} 

和您的储蓄账户必须是这样的:

public class SavingAccount : Account 
{ 
    public override string AccountType 
    { 
     get { return "Savings Account"; } 
    } 
} 
相关问题