C# 属性隐藏继承的成员
我有以下课程:C# 属性隐藏继承的成员,c#,list,unity3d,C#,List,Unity3d,我有以下课程: public abstract class Tween : MonoBehaviour { protected List<TweenItem> items = new List<TweenItem>(); } public class TweenItem { // Properties } public class ValueTweenItem : TweenItem { // Properties } 当我这样做时,我得到以下
public abstract class Tween : MonoBehaviour {
protected List<TweenItem> items = new List<TweenItem>();
}
public class TweenItem {
// Properties
}
public class ValueTweenItem : TweenItem {
// Properties
}
当我这样做时,我得到以下警告:
Assets/simple/Scripts/Util/Tween/ColorTween.cs(9,40):警告CS0108:simple.Tween.ColorTween.items'隐藏继承的成员
simple.Tween.Tween.items'。如果要隐藏,请使用新关键字
我曾尝试添加覆盖
和虚拟
关键字,但没有效果
我怎样才能让这个警告消失
编辑
以下是基础:
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;
}
}
使用UnityEngine;
使用System.Collections.Generic;
名称空间Simple.Tween{
公共抽象类AbstractTween:单行为{
[序列化字段]
受保护的列表项=新列表();
}
公共抽象类Tween:AbstractTween{
//这里的常见功能
}
公共类TweenItem{
公共部分;
公共浮动持续时间=2f;
public bool playOnStart=false;
[hideininstecpt]
公共浮动时间=0f;
[hideininstecpt]
公共bool complete=false;
[hideininstecpt]
公共bool-runTween=假;
}
公共类ValueTween项:AbstractTween{
公共字符串propertyName;
公共浮动起始值=0f;
公共浮动端值=1f;
}
公共类ColorTween项:AbstractTween{
公共梯度;
}
}
下面是我正在使用的类:
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);
}
}
}
使用UnityEngine;
使用System.Collections.Generic;
名称空间Simple.Tween{
[AddComponentMenu(“Simple/Tween/Value Tween”)]
公共类价值Tween:Tween{
[序列化字段]
受保护的列表项=新列表();
无效更新(){
//设置对象的颜色
foreach(项目中项目间的值){
if(item.complete | | item.runTween==false){
继续;
}
}
}
void TweenValue(组件项、字符串字段、浮点值){
item.GetType().GetProperty(field).SetValue(item,value,null);
}
}
}
您只需按照编译器的建议使用new关键字即可
protected new List<ValueTweenItem> items = new List<ValueTweenItem>();
受保护的新列表项=新列表();
或者直接使用bass类变量(已经实例化) 您只需按照编译器的建议使用new关键字即可
protected new List<ValueTweenItem> items = new List<ValueTweenItem>();
受保护的新列表项=新列表();
或者直接使用bass类变量(已经实例化) 遵循实体打开/关闭原则: 您的抽象类在其定义中定义了一个具体类,这正是创建泛型要解决的问题: 首先,定义您的抽象:
public abstract class AbstractTween<T> : MonoBehaviour
{
protected List<T> items = new List<T>();
...
}
现在更改抽象类声明如下:
public abstract class AbstractTween<T> : MonoBehaviour where T : ITweenItem
{ ... }
ColorTweenItem
或ValueTweenItem
似乎扩展了TweenItem
如果您想将其添加到摘要中,则只能使用TweenItems
:
public abstract class AbstractTween<T> : MonoBehaviour where T : TweenItem
公共抽象类AbstractTween:MonoBehavior,其中T:TweenItem
遵循坚实的打开/关闭原则:
您的抽象类在其定义中定义了一个具体类,这正是创建泛型要解决的问题:
首先,定义您的抽象:
public abstract class AbstractTween<T> : MonoBehaviour
{
protected List<T> items = new List<T>();
...
}
现在更改抽象类声明如下:
public abstract class AbstractTween<T> : MonoBehaviour where T : ITweenItem
{ ... }
ColorTweenItem
或ValueTweenItem
似乎扩展了TweenItem
如果您想将其添加到摘要中,则只能使用TweenItems
:
public abstract class AbstractTween<T> : MonoBehaviour where T : TweenItem
公共抽象类AbstractTween:MonoBehavior,其中T:TweenItem
那么,您希望发生什么?默认情况下,ValueTween
上会有一个items
,因为它继承自Tween
,您不需要声明它。如果您真的想隐藏它,请使用new
关键字。item now是字段您必须将其更改为property public/protected Virtual查看您的编辑。。。您的问题是什么?如何编译公共类值TweenItem:AbstractTween
呢?您的TweenItem类不会扩展抽象Tween。。。这些项看起来只是数据类。那么,您希望发生什么?默认情况下,ValueTween
上会有一个items
,因为它继承自Tween
,您不需要声明它。如果您真的想隐藏它,请使用new
关键字。item now是字段您必须将其更改为property public/protected Virtual查看您的编辑。。。您的问题是什么?如何编译公共类值TweenItem:AbstractTween
呢?您的TweenItem类不会扩展抽象Tween。。。这些项看起来就像是数据类。仅仅因为它删除了警告,并不意味着这就是你想要做的。@Jonesopolis这是真的。OP指的是警告。但这当然不一定是应该做的。@Moe,当然不是轻描淡写你的答案,只是努力做一个好公民。如果在一个有一些内容的班级里做,这将不可避免地导致某种形式的崩溃。。记住坚实,开放的改变,但封闭的修改。。。这意味着在许多情况下,子类化。。就像这样。仅仅因为它删除了警告,并不意味着这就是你想要做的。@Jonesopolis这是真的。OP指的是警告。但这当然不一定是应该做的。@Moe,当然不是轻描淡写你的答案,只是努力做一个好公民。如果在一个有一些内容的班级里做,这将不可避免地导致某种形式的崩溃。。记住坚实,开放的改变,但封闭的修改。。。这意味着在许多情况下,子类化。。像这样,好吧。。。在ValueTween
类中,我有这个foreach(items中的ValueTweenItem项){item.complete}
它不再能看到属性complete
。那是什么?其实我上面的评论是错的,你应该