我错过了使用指令或汇编引用?

时间:2014-04-26 15:28:52

标签: 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)
            {
                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类中添加一些内容以允许代码运行(可能是多态的),但我不确定如何继续进行。我非常感谢任何帮助。谢谢:))

3 个答案:

答案 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"; }
    }
}