首页 > 解决方案 > Foreach 多态性

问题描述

我正在编写一个简单的 rpg 游戏以在 C# 中进行一些练习,但我遇到了一个问题。我在使用 foreach 时无法访问子参数。有没有办法不对每种类型使用两个不同的列表并保留在基本类型的列表中?

class A{}
class B : A{public int hp=5}
class C : A{public int hp=10}
List<A> d = new List();
d.Add(new B());
d.Add(new C());
foreach(A a in d){
    a.hp--;            //does not see 'hp'
}

标签: c#inheritancepolymorphism

解决方案


一种解决方案是拥有BC实现一个通用接口,然后将列表更改为该类型。

例如

public interface IHasHealth
{
    int hp { get; set; }
}

public class A{}

public class B : A, IHasHealth
{
    public int hp { get; set; } = 5;
}

public class C : A, IHasHealth
{
    public int hp { get; set; } = 10;
}

public void Main(){
    List<IHasHealth> d = new List<IHasHealth>();
    d.Add(new B());
    d.Add(new C());
    foreach(IHasHealth a in d){
        a.hp--;
    }
}

推荐阅读