在单独的基类中自动转换对基类类型变量的调用

时间:2017-10-19 07:41:02

标签: c# inheritance

对不好的标题感到抱歉,发现很难缩小这个问题的确切范围。

我有两个基本上并行构建的类层次结构:对于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。这些方法都不干净,我觉得必须有一些更好的方法来使用继承来做到这一点。

感谢您的帮助。

1 个答案:

答案 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...
}