【问题标题】:Foreach Polymorphism [duplicate]Foreach 多态性 [重复]
【发布时间】:2019-01-12 21:26:02
【问题描述】:

我正在编写一个简单的 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'
}

【问题讨论】:

  • 阅读全文series,它将帮助您在 c# 和 rpg 游戏中走上正轨。
  • 回答您的问题,List&lt;T&gt; 的类型 T 应该是您可以用来利用所需共性的类型,否则您的多态性将毫无用处。在您的情况下,A 似乎不是正确的类型。您要么缺少 BC 的通用基本类型或接口。
  • 变量a 的类型为AA 是否有 hp 属性?不...如果您希望A(以及从A 派生的所有类型)应该具有公共hp 属性,请将hp 设为A 的属性,而不是B 或@987654338 的属性@...
  • @elgonzo 'A' 在我的项目中有很多重要的东西,包括 'hp',这只是一个例子。
  • 您的问题清楚地表明A 没有hp 属性/字段。此外,您提到的错误/问题a.hp-- 不能“看到”表明A 没有hp 属性/字段(或者该属性可能是受保护的/私有的)。如果您对某些代码提出问题,则问题中的代码示例应反映代码的实际情况。避免像瘟疫一样在您的示例代码中创建一个在问题上下文方面与您的真实代码显着不同的场景。

标签: c# inheritance polymorphism


【解决方案1】:

一种解决方案是让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--;
    }
}

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2012-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2020-08-21
    相关资源
    最近更新 更多