基本上我有
继承自Projectile类的BallisticProjectile类。现在我可以这样做了
Projectile A;
BallisticProjectile B;
Projectile myfunction()
{
return B;
}然后返回B作为投射物。
但我做不到
list<Projectile> myfunction()
{
return B;
}我不确定该如何克服这一点。
我是否需要一个包装类来包装它,这样我就可以像这样
ProjectileList
{
list<projectile> Projectiles;
}
BallisticProjectiles : Projectile
{
list<ballisticprojectile> Projectiles;
}真实代码(来自unity游戏引擎)
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public abstract class Weapon : MonoBehaviour {
IEnumerable<Projectile> _Projectile;
public virtual IEnumerable<Projectile> projectile
{
get
{
return _Projectile;
}
set
{
_Projectile = value;
}
}
}其他脚本
public override IEnumerable<BallisticProjectile> projectile {
get {
if(_BallisticProjectile == null)
Debug.Log("ERROR: " + this.gameObject.name + " NO PROJECTILE");
return _BallisticProjectile;
}
set {
if(value is IEnumerable<BallisticProjectile>)
{
_BallisticProjectile = value as IEnumerable<BallisticProjectile>;
base.projectile = _BallisticProjectile;
}
}
}发布于 2013-07-13 01:20:07
List<BallisticProjectile>不能用作List<Projectile>。理解原因的一种简单方法是,您可以将new Projectile()添加到List<Projectile>中,这在List<BallisticProjectile>中没有任何意义。
此方法允许您以通用方式设置投射类型,并可能解决您的问题(与p.s.w.g建议的相同):
public class ProjectileList<T> where T : Projectile
{
List<T> Projectiles;
}更新:在您的示例中,可能如下所示:
public abstract class Weapon<T> : MonoBehaviour where T : Projectile {
public virtual IList<T> Projectiles { get; set; }
}然后:
public class Crossbow : Weapon<BallisticProjectile> {
// if you needed to override the implementation, you'd start with this:
// public override IList<BallisticProjectile> Projectiles { get { } set { } }
}这里的问题是,当您覆盖属性(或其他成员)时,C#不允许您更改它的类型。这些类型在某种程度上是否兼容并不重要,您必须用相同的类型来声明它。在这种情况下,泛型是一种将虚拟属性更改为BallisticProperty的方法。
发布于 2013-07-13 00:49:52
在C# 4中,如果B继承自A,则可以将IEnumerable<B>转换为IEnumerable<A>。这是可能的,因为IEnumerable<T>与T是协变的(但List<T>与T是逆变的)。因此,您可以使用IEnumerable<>来代替List<>
https://stackoverflow.com/questions/17619824
复制相似问题