【问题标题】:Base class to Derived class in Iteration迭代中的基类到派生类
【发布时间】:2014-09-15 07:32:58
【问题描述】:

我有这个具有一些属性的基类。在我的派生类中,这是我想要实现一些计算(例如加法和减法)的地方。

我实现了一个基类列表。 List<A>。在我的迭代(foreach)中,我必须实现派生类来进行计算(示例计算 - 加法)。 我们如何实现这一点?如果不清楚,请告诉我。

public class A {
  public int value1 { get; set;}
  public int value2 { get; set;}
  public virtual int sum { get { return 0 ;} }
}

public class B : A {
  public override int sum {
     get {
        return value1 + value2;
     }
  }
}



 List<A> collection = new List<A>();

 collection.Add(new A { value1 = 1, value2 = 1 });
 collection.Add(new A { value1 = 2, value2 = 2 });
 collection.Add(new A { value1 = 3, value2 = 3 });

 foreach (var item in collection.OfType<B>())
 {
    Console.WriteLine(item.sum);
 }

【问题讨论】:

  • 目前的方法有什么问题完全不清楚
  • 听起来你需要强制转换,但不清楚你正在尝试做什么......你打算如何保证列表中的每个对象都是 B 对象?如果是,为什么不是B 的列表?
  • 如果您的List&lt;A&gt; 包含B 实例运行时将调用B.Sum。我相信这就是您要问的问题。
  • 听起来您可能正在使用继承,而实际上您想要类似策略模式的东西。您似乎想使用单一类型的对象列表,然后在运行时选择具体的求和逻辑。
  • 嗨,我添加了迭代代码。这是在 foreach 循环中退出的代码。

标签: c# .net


【解决方案1】:

正如评论中提到的,只需使用以下代码:

List<A> collection = new List<A>();

collection.Add(new B { value1 = 1, value2 = 1 });
collection.Add(new B { value1 = 2, value2 = 2 });
collection.Add(new B { value1 = 3, value2 = 3 });

foreach (var item in collection)
{
   Console.WriteLine(item.sum);
}

sum 方法将在运行时解析为B 上的方法,一切正常。

【讨论】:

    【解决方案2】:

    只需按照上面评论中的说明进行修改

    collection.Add(new A { value1 = 1, value2 = 1 });
     collection.Add(new A { value1 = 2, value2 = 2 });
     collection.Add(new A { value1 = 3, value2 = 3 });
    
     foreach (var item in collection.OfType<B>())
     {
        Console.WriteLine(item.sum);
     }
    

    对此,它应该可以工作

    collection.Add(new B { value1 = 1, value2 = 1 });
     collection.Add(new B { value1 = 2, value2 = 2 });
     collection.Add(new B { value1 = 3, value2 = 3 });
    
     foreach (var item in collection)
     {
        Console.WriteLine(item.sum);
     }
    

    这是因为在您的示例中,类型 A 的每个实例都只是类型 A,而类型 B 的每个实例都是类型 B 和类型 A。

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多