对不好的标题感到抱歉,发现很难缩小这个问题的确切范围。
我有两个基本上并行构建的类层次结构:对于BaseObject的每个子类型,都有一个BaseUIObject的子类型。具体原因是因为BaseObjects实际上是Scriptable Objects(unity),因此我使用另一组类来表示其中一个可编写脚本的对象的每个实例。
示例代码:
public abstract class BaseUIObject {
public BaseObject someObject;
public void Setup(BaseObject baseObject)
{ this.baseObject = baseObject; }
}
public class SomeUIObject : BaseUIObject {
public void Setup(SomeObject someObject)
{ base.Setup(someObject); SomeUIObjectSpecificRoutine(); }
private void SomeObjectSpecificRoutine() {
someObject.doSubClassFunction();
}
}
当将SomeObject类型的对象传递给SomeUIObject的Setup时,它将被存储为BaseObject而不是SomeObject。是否有任何干净的方法来防止这种情况发生?
现在我有两个选项要么在BaseUIObject的每个子类中定义someObject变量,要么每次在SomeUIObject的方法中使用它时显式地转换(SomeObject)someObject。这些方法都不干净,我觉得必须有一些更好的方法来使用继承来做到这一点。
感谢您的帮助。
答案 0 :(得分:1)
看起来像是一个泛型给我的好地方:
public abstract class BaseUIObject<T> where T : BaseObject
{
public T theObject { get; private set; }
public virtual void Setup(T baseObject)
{
this.theObject = baseObject;
}
}
然后,在具体的UI对象中:
public class SomeUIObject : BaseUIObject<SomeObject>
{
public override void Setup(SomeObject someObject)
{
base.Setup(someObject);
SomeUIObjectSpecificRoutine();
}
// rest of concrete class code...
}