C# I';m缺少using指令或程序集引用?
我对以下代码有问题C# I';m缺少using指令或程序集引用?,c#,inheritance,polymorphism,C#,Inheritance,Polymorphism,我对以下代码有问题 class AccountDB { public void DumpCustomers(TextWriter textWriter) { foreach (Customer c in _Customers) { textWriter.WriteLine("\t{0}", c); foreach (Account a in c.Accounts) {
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;
}
}
类AccountDB
{
公共用户(TextWriter TextWriter)
{
foreach(客户中的客户c)
{
textWriter.WriteLine(“\t{0}”,c);
foreach(c.账户中的账户a)
{
textWriter.WriteLine(“\t\t{0}”,a.AccountType);
textWriter.WriteLine(“\t\t\t{0,-20}:{1,13}”,“期初余额”,a.OpeningBalanceString);
foreach(a.Transactions中的ITransaction t)
textWriter.WriteLine(“\t\t\t{0,-20}:{1,13}”,t.Description,t);
textWriter.WriteLine(“\t\t\t{0,-20}:{1,13}”,“期末余额”,a);
}
}
}
}
类别储蓄账户:账户
{
公共字符串AccountType
{
获取{返回“储蓄帐户”;}
}
}
类别:信用账户
{
公共字符串AccountType
{
获取{返回“信用帐户”;}
}
}
类客户
{
私有字符串\u名称;
私有列表_账户=新列表();
公共字符串名
{
获取{return\u Name;}
}
公共只读集合帐户
{
获取{return _Accounts.AsReadOnly();}
}
公共客户(字符串名称)
{
_名称=名称;
}
公共作废账户(账户)
{
如果(!\u Accounts.Contains(account))
{
_账户。添加(账户);
账户。记录客户(本);
}
}
公共重写字符串ToString()
{
返回_Name;
}
}
当编译器尝试访问AccountType字符串时,出现以下错误:
“Example_Namespace.Account”不包含“AccountType”的定义,并且找不到接受“Example_Namespace.Account”类型的第一个参数的扩展方法“AccountType”(是否缺少using指令或程序集引用?)
我知道必须向Account类中添加一些内容才能运行代码(可能是多态的),但我不确定如何进一步进行。我将非常感谢任何帮助。谢谢:)您应该将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"; }
}
}
如果Account应该单独实例化,并且可以为AccountType属性提供有效的实现,那么这是有意义的。否则,您应该使用抽象类。好吧,您写道:
foreach (Account a in c.Accounts)
{
textWriter.WriteLine("\t\t{0}", a.AccountType);
...
}
问题是您在SavingsAccount和CreditAccount中定义了AccountType属性,这两个类都是从Account类继承的
当c.Accounts
中的a
不是SavingsAccount或CreditAccount时,会发生此错误
解决方案是将(虚拟)AccountType属性添加到Account类,并在子类中重写它。此处:
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"; }
}
}
让我们看看客户类别?它可能引用Account类,但Account类没有AccountType属性,它的子类有。我只是把它放在:)这都在同一个名称空间中吗。这是我在这里发布之前检查的第一件事。