【问题标题】:Property hides inherited member属性隐藏继承的成员
【发布时间】:2015-12-23 19:43:02
【问题描述】:

我有以下课程:

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 memberSimple.Tween.Tween.items'。如果要隐藏,请使用 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);
        }

    }
}

【问题讨论】:

  • 好吧,你想要发生什么?默认情况下,ValueTween 上面会有一个items,因为它继承自Tween,所以不需要声明它。如果您真的想隐藏它,请使用 new 关键字。
  • item 现在是字段,您必须将其更改为 property public / protected virtual
  • 我看到了您的编辑...您的问题是什么?
  • public class ValueTweenItem : AbstractTween&lt;ValueTweenItem&gt; 如何编译?
  • 您的 TweenItem 类不是为了扩展抽象 Tween...这些项目看起来只是数据类。

标签: c# list unity3d


【解决方案1】:

遵循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

【讨论】:

  • 好的...在ValueTween 类中,我有这个foreach(ValueTweenItem item in items){item.complete} 它不能再看到属性complete。那是什么?
  • 其实我上面的评论是错误的,你应该没有问题访问你的项目属性。
  • 输入Simple.Tween.ColorTweenItem' does not contain a definition for complete',找不到扩展方法complete' of type Simple.Tween.ColorTweenItem'
  • 我回答了你的问题。
  • ValueTweenItemColorTweenItem 都需要扩展 TweenItem 仅供参考
【解决方案2】:

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

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

或直接使用您的低音类变量(已实例化)。

【讨论】:

  • 仅仅因为它删除了警告,这并不意味着它一定是你想要做的。
  • @Jonesopolis 这是真的。 OP指的是警告。但当然不一定是应该做的。
  • @Moe,当然不会轻视你的回答,只是想成为一个好公民。
  • 如果在一个有一些内容的类中完成,这将不可避免地导致某种形式的崩溃。记住 SOLID,开放更改但关闭修改...这意味着在许多情况下子类化。 . 像这样。
猜你喜欢
  • 2012-02-13
  • 2010-09-05
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多