财产隐藏了继承成员

时间:2015-12-23 19:43:03

标签: c# list unity3d

我有以下课程:

public abstract class Tween : MonoBehaviour {
    protected List<TweenItem> items = new List<TweenItem>();
}
public class TweenItem {
    // Properties
}

public class ValueTweenItem : TweenItem {
    // Properties
}

在这堂课中,我试图覆盖items

public class ValueTween : Tween{
    protected List<ValueTweenItem> items = new List<ValueTweenItem>();
}

当我这样做时,我收到以下警告:

  

Assets / simple / Scripts / Util / Tween / ColorTween.cs(9,40):警告CS0108:Simple.Tween.ColorTween.items' hides inherited member Simple.Tween.Tween.items&#39;。如果要隐藏

,请使用new关键字

我尝试添加overridevirtual个关键字,但这并不起作用。

如何让这个警告消失?

修改

这是基地:

using UnityEngine;
using System.Collections.Generic;

namespace Simple.Tween{
    public abstract class AbstractTween<T> : MonoBehaviour {
        [SerializeField]
        protected List<T> items = new List<T>();
    }

    public abstract class Tween : AbstractTween<TweenItem>{

        // Common functions here

    }

    public class TweenItem {
        public Component component;
        public float duration = 2f;
        public bool playOnStart = false;

        [HideInInspector]
        public float time = 0f;
        [HideInInspector]
        public bool complete = false;
        [HideInInspector]
        public bool runTween = false;
    }

    public class ValueTweenItem : AbstractTween<ValueTweenItem> {
        public string propertyName;
        public float startValue = 0f;
        public float endValue = 1f;
    }

    public class ColorTweenItem : AbstractTween<ColorTweenItem> {
        public Gradient gradient;
    }
}

然后这是我正在使用的课程:

using UnityEngine;
using System.Collections.Generic;

namespace Simple.Tween{
    [AddComponentMenu("Simple/Tween/Value Tween")]
    public class ValueTween : Tween{

        [SerializeField]
        protected List<ValueTweenItem> items = new List<ValueTweenItem>();

        void Update(){
            // Set the color of the object
            foreach(ValueTweenItem item in items){
                if(item.complete || item.runTween == false){
                    continue;
                }
            }
        }

        void TweenValue(Component item, string field, float value){
            item.GetType().GetProperty(field).SetValue(item, value, null);
        }

    }
}

2 个答案:

答案 0 :(得分:3)

遵循SOLID开放/封闭原则:

您的抽象类在其定义中定义了一个具体的类,这正是创建的泛型要解决的问题:

首先,定义你的抽象:

public abstract class AbstractTween<T> : MonoBehaviour 
{
   protected List<T> items = new List<T>();
   ...
}

现在构建具体的实现:

public class ValueTween : AbstractTween<ValueTweenItem>
{   ... }
public class Tween : AbstractTween<TweenItem>
{   ... }

如果您的所有商品都有一个名为&#34; Text&#34;并且您希望所有物品都具有该属性,然后您执行此操作:

public interface ITweenItem
{
    string Text { get; set; }
}

现在更改抽象类声明,如下所示:

public abstract class AbstractTween<T> : MonoBehaviour where T : ITweenItem
{  ... }

编辑:

您的项目类应简单定义为:

public class ValueTweenItem : TweenItem {
    public string propertyName;
    public float startValue = 0f;
    public float endValue = 1f;
}

public class ColorTweenItem : TweenItem {
    public Gradient gradient;
}

ColorTweenItemValueTweenItem似乎延伸TweenItem

如果你想将它添加到摘要中,那么只能使用TweenItems

public abstract class AbstractTween<T> : MonoBehaviour where T : TweenItem

答案 1 :(得分:2)

您可以根据编译器的建议使用new关键字。

protected new List<ValueTweenItem>  items = new List<ValueTweenItem>();

或者直接使用你的贝司类变量(已经实例化)。