我遇到以下代码问题。
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字符串时,出现以下错误:
&#39; Example_Namespace.Account&#39;不包含&#39; AccountType&#39;的定义并且没有扩展方法&#39; AccountType&#39;接受类型&#39; Example_Namespace.Account&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)
我知道必须在Account类中添加一些内容以允许代码运行(可能是多态的),但我不确定如何继续进行。我非常感谢任何帮助。谢谢:))
答案 0 :(得分:2)
您应该将AccountType属性添加到Account类。有两种方法:
使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"; }
}
}
如果Account应该自己实例化并且可以为AccountType属性提供有效的实现,那么这将是有意义的。否则你应该使用抽象类。
答案 1 :(得分:0)
嗯,你写道:
foreach (Account a in c.Accounts)
{
textWriter.WriteLine("\t\t{0}", a.AccountType);
...
}
问题是您已在 SavingsAccount 和 CreditAccount 中定义了 AccountType 属性,这些类是从帐户继承的 em> class。
当a
中的c.Accounts
不 SavingsAccount 或 CreditAccount 时,会发生错误。
解决方案是将(虚拟) AccountType 属性添加到帐户类,并将其覆盖在子类中。
答案 2 :(得分: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"; }
}
}