Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 如何访问列表中子类的方法?_C#_.net_List - Fatal编程技术网

C# 如何访问列表中子类的方法?

C# 如何访问列表中子类的方法?,c#,.net,list,C#,.net,List,我有一个父类“bankAccount”,它有两个子类,然后这些子类派生到其他子类中。我假设创建一个孙子对象并将其保存在列表中,然后能够和孙子的方法交互。然而,我似乎无法访问这些类的方法。我所能做的就是与祖父母类的方法交互 这就是我向列表中添加子类的方式 List<bankAccount> accounts = new List<bankAccount>(); accounts.Add(new VistaAccount(nAccount,pass,nameClient,ba

我有一个父类“bankAccount”,它有两个子类,然后这些子类派生到其他子类中。我假设创建一个孙子对象并将其保存在列表中,然后能够和孙子的方法交互。然而,我似乎无法访问这些类的方法。我所能做的就是与祖父母类的方法交互

这就是我向列表中添加子类的方式

List<bankAccount> accounts = new List<bankAccount>();
accounts.Add(new VistaAccount(nAccount,pass,nameClient,balance,interest));
List accounts=new List();
添加(新的VistaAccount(帐户、通行证、名称客户、余额、利息));
首先,了解为什么C#不允许你在银行账户列表上这样做

如果你有一份各种银行账户的清单,那么你对其中任何一个账户所做的任何事情都需要适用于每一个账户。不能对对象调用方法,除非保证该对象具有该方法。静态类型系统是为了尽早警告您这一点

也就是说,如果你真的知道你只有少数几种银行账户类型,你可以单独列举它们:

foreach(var account in accounts.OfType<VistaAccount>())
{
    // call methods specific to "Vista" accounts
}

foreach(var account in accounts.OfType<OtherAccount>())
{
    // call methods specific to "Other" accounts
}
然后在每种帐户中实现(
覆盖
)该方法,并提供特定于该类型的说明

  • 从长远来看,这可以很好地扩展,因为在引入更多帐户类型时,您不必记住引入特殊情况。为您未来的自我或未来的代码维护者记录一件事
  • 这更方便,因为如果您忘记为子类型指定操作,您将在编译时收到一条很好的消息。所以有一个很好的安全网,以防你忘记做这件事
  • 因为现在每种类型的银行帐户都保证支持该操作,所以编译器将很高兴地允许您甚至对银行帐户列表进行调用。您不需要我最初建议的手动类型检查
首先,了解为什么C#不允许你在银行账户列表上这样做

如果你有一份各种银行账户的清单,那么你对其中任何一个账户所做的任何事情都需要适用于每一个账户。不能对对象调用方法,除非保证该对象具有该方法。静态类型系统是为了尽早警告您这一点

也就是说,如果你真的知道你只有少数几种银行账户类型,你可以单独列举它们:

foreach(var account in accounts.OfType<VistaAccount>())
{
    // call methods specific to "Vista" accounts
}

foreach(var account in accounts.OfType<OtherAccount>())
{
    // call methods specific to "Other" accounts
}
然后在每种帐户中实现(
覆盖
)该方法,并提供特定于该类型的说明

  • 从长远来看,这可以很好地扩展,因为在引入更多帐户类型时,您不必记住引入特殊情况。为您未来的自我或未来的代码维护者记录一件事
  • 这更方便,因为如果您忘记为子类型指定操作,您将在编译时收到一条很好的消息。所以有一个很好的安全网,以防你忘记做这件事
  • 因为现在每种类型的银行帐户都保证支持该操作,所以编译器将很高兴地允许您甚至对银行帐户列表进行调用。您不需要我最初建议的手动类型检查

您不能通过父级api访问子级成员。您需要有一个对公开成员的类型的引用,可以通过强制转换(这通常是坏的/难看的),也可以通过定义一个引用作为childs类型的开始


如果确实需要子对象列表,为什么要使用父对象列表?如果不是更多,您需要重新考虑当前方法的设计。

您不能通过父对象的api访问子对象的成员。您需要有一个对公开成员的类型的引用,可以通过强制转换(这通常是坏的/难看的),也可以通过定义一个引用作为childs类型的开始


如果确实需要子对象列表,为什么要使用父对象列表?如果不是更多的话,你需要重新考虑当前方法的设计。

很简单:你想要的东西做不到,实际上是错的

高级:你想做的事可以用反射或者在施法后完成,但是仍然是非常错误的


只能对
列表中的项目使用基类(
BankAccount
)中声明的方法。如果您需要孙子对象以不同的方式运行,您应该重写孙子类中的方法(在
BankAccount
类中必须是虚拟的)。

简单地说:您想要的东西无法实现,实际上是错误的

高级:你想做的事可以用反射或者在施法后完成,但是仍然是非常错误的

只能对
列表中的项目使用基类(
BankAccount
)中声明的方法。如果您需要孙子对象以不同的方式运行,则应覆盖孙子类中的方法(在
BankAccount
类中必须是虚拟的)。

这与。您有一组对象-一些对象可能属于
VistaAccount
类型,其他对象属于不同类型,但它们都继承自
bankAccount
。通过将它们放入
列表
,您可以将它们全部转换为基类,
bankAccount

在这种情况下,重点是您将它们都视为
bankAccount
,而不管它们是
VistaAccount
还是其他类型。唯一重要的类型是
bankAccount
,子类并不重要

如果您正在检查这些单独的实例,看看它们到底是什么类型,那么很可能是出了问题。如果您必须检查每个对象以查看其类型,那么目的就失败了。就其逻辑结论而言,它可能只是一个
列表

你想要的(如果可能的话)是这样一种设计:你在每个类上调用的方法都是相同的,只有