【问题标题】:Is polymorphism possible with List ? How to do it in a constructor?List 可以实现多态性吗?如何在构造函数中做到这一点?
【发布时间】:2022-10-13 19:59:27
【问题描述】:

我正在尝试在构造函数中使用多态性,但如果没有解决方法就无法使其工作。

我有 :

public class A { }
public class B : A { }

为什么这不起作用:

 IList<B> blist = new List<B> ...
 IList<A> alist = (IList<A>)blist ;

当没有列表的相同工作正常时:

B bt = new B..
A a = (A)b;

当想要在构造函数中使用列表时,这尤其令人讨厌,尤其是在执行任何其他操作之前调用基本构造函数的 c# 限制。 禁止这样做:

public X(IList<B> param) : base((IList<A> param))
{}

有什么方法可以在不调用虚拟 base() 并完全重写构造函数的情况下正确地做到这一点?

我发现的一种方法是: 根据( section.Select(b => (A) b).ToList() )

但感觉很笨拙...

【问题讨论】:

  • X 来自什么?
  • 它派生自另一个类 (Y)。它的构造函数中有一个 List<A> 而不是 B

标签: c# constructor polymorphism


【解决方案1】:

有一个 Linq 扩展 Cast&lt;T&gt;() 简单地将每个元素转换为给定类型。

IList<B> blist = new List<B>();
IList<A> alist = blist.Cast<A>().ToList();

【讨论】:

  • 肯定好一点,更清楚。
猜你喜欢
  • 2010-10-30
  • 2011-01-31
  • 1970-01-01
  • 2011-03-08
  • 2012-09-28
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多