【问题标题】:Adding inherited items to same list container将继承的项目添加到同一个列表容器
【发布时间】:2014-05-13 05:14:31
【问题描述】:

伙计们,我不确定我是否遗漏了任何重要的 OOP 概念,如果我遗漏了什么,请指导我。 我有一个基类和一些继承类如下

Class Shape {}
Class Arc:Shape{}
Class Line:Shape{}

现在我想为所有生成的形状创建一个容器(列表),然后当我回读时,我会将对象转换为某种类型。最好的方法是什么。泛型是我下面显示的唯一方法吗?请帮忙

SortedList shapeList;
public int addShapes(Shape item)  {shapeList.Add(ItemID, item);}

【问题讨论】:

  • 通用容器和 OOP 的要点是您不需要将对象强制转换回来,因为对象的行为会根据它们的实际类发生变化,即使通过基类引用调用也是如此。
  • “是泛型是我在下面展示的唯一方法” - 你没有展示任何泛型的使用。请注意,SortedList<,> 也确实是一个键/值映射...如果您只想要一个列表,为什么不使用 List<T>
  • 您的容器应该是List<Shape> 或另一个已经存在的通用容器。
  • @JonSkeet,是的,你是对的

标签: c# list oop


【解决方案1】:

您可以将所有Shape 实例放在List<Shape> 中:

var list = new List<Shape>();
list.Add(new Arc());
list.Add(new Line());
list.Add(new Arc());
list.Add(new Arc());
list.Add(new Line());

要获取所有 Arc 实例,您可以这样做:

var arcs = list.OfType<Arc>();

同样,对于所有 Line 实例:

var lines = list.OfType<Line>();

【讨论】:

    【解决方案2】:

    将您的对象添加到List&lt;Shape&gt;

    var list = new List<Shape>();
    list.Add(new Arc());
    list.add(new Line());
    list.Add(new Arc());
    

    然后使用 LINQ 查询原始列表并检索您的对象:

    var arcList = list.Where(x => x.GetType() == typeof(Arc)).ToList();
    

    【讨论】:

    • +0 像马克的回答中的.OfType 有什么问题?
    • @RubenBartelink 起初我没有注意到相关 MSDN 文档中的方法 OfType() 。这是我不知道的事情。我想 Mark 提出的建议做同样的工作,比较我的 LINQ 查询。我认为我的是一个有效的替代方案。
    • 虽然这是一个非常好的答案,但它是在第一个答案之后添加的,并且在任何有用的方式上都没有什么不同。我个人会删除答案或对其进行编辑以实际添加对对话有用的内容。对我来说,.OfType 是一个更好的默认值(即 ~= as),而不是进行精确的类型检查。除非您认为它与 OP 的问题真正相关,否则作为坏建议但又是重复的组合 几乎 将我推到 -1。
    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2015-06-24
    • 2013-06-14
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多