我有以下课程:
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:
,请使用new关键字Simple.Tween.ColorTween.items' hides inherited member
Simple.Tween.Tween.items&#39;。如果要隐藏
我尝试添加override
和virtual
个关键字,但这并不起作用。
如何让这个警告消失?
这是基地:
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);
}
}
}
答案 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;
}
ColorTweenItem
或ValueTweenItem
似乎延伸TweenItem
如果你想将它添加到摘要中,那么只能使用TweenItems
:
public abstract class AbstractTween<T> : MonoBehaviour where T : TweenItem
答案 1 :(得分:2)
您可以根据编译器的建议使用new关键字。
protected new List<ValueTweenItem> items = new List<ValueTweenItem>();
或者直接使用你的贝司类变量(已经实例化)。