属性隐藏继承的成员
本文关键字:成员 继承 隐藏 属性 | 更新日期: 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'。如果要隐藏,请使用新关键字
我已经尝试添加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);
}
}
}
遵循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;
}
ColorTweenItem
或ValueTweenItem
似乎扩展了TweenItem
如果你想将其添加到摘要中,那么只能使用TweenItems
:
public abstract class AbstractTween<T> : MonoBehaviour where T : TweenItem
您可以按照编译器的建议简单地使用新关键字。
protected new List<ValueTweenItem> items = new List<ValueTweenItem>();
或者直接使用bass类变量(已经实例化)。