属性隐藏继承的成员

本文关键字:成员 继承 隐藏 属性 | 更新日期: 2023-09-27 18:27:57

我有以下类:

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/ssimple/Scripts/Util/Tween/ColorTween.cs(9,40):警告CS0108:Simple.Tween.ColorTween.items' hides inherited member simple.Tween.Tween.items'。如果要隐藏,请使用新关键字

我已经尝试添加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);
        }
    }
}

属性隐藏继承的成员

遵循SOLID打开/关闭原则:

你的抽象类在它的定义中定义了一个具体的类,这正是泛型被创建来解决的问题:

首先,定义你的抽象:

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

现在构建具体实现:

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

如果你所有的物品都有一个名为"文本"的属性,并且你希望你所有的东西都有这个属性,那么你应该这样做:

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

您可以按照编译器的建议简单地使用新关键字。

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

或者直接使用bass类变量(已经实例化)。