Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# I';m缺少using指令或程序集引用?_C#_Inheritance_Polymorphism - Fatal编程技术网

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属性,它的子类有。我只是把它放在:)这都在同一个名称空间中吗。这是我在这里发布之前检查的第一件事。