C# 在迭代中从基类到派生类

C# 在迭代中从基类到派生类,c#,.net,C#,.net,我有一个基类,它有一些属性。在我的派生类中,这就是我想要实现一些计算加法和减法的地方 我实现了一个基类列表。列表在我的迭代foreach中,我必须实现派生类的函数来进行计算示例计算-加法。 我们如何实施这一点?如果不清楚,请告诉我 public class A { public int value1 { get; set;} public int value2 { get; set;} public virtual int sum { get { return 0 ;} } } p

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

我实现了一个基类列表。列表在我的迭代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);
 }

如注释中所述,只需使用以下代码:

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上的方法,一切都应该正常工作。

只需按照上面的注释中所述进行修改即可

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);
 }

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

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