2017-10-19 38 views
0

对不好的标题感到难以缩小这个问题的相关性。在单独的基类中自动将调用强制转换为基类变量

我有两个基本上并行构建的类层次结构:对于BaseObject的每个子类型,都有一个BaseUIObject的子类型。具体原因是因为BaseObjects实际上是脚本化对象(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的安装程序时,就变成存储为BaseObject代替SomeObject。有没有干净的方法来防止这种情况发生?

现在我有两个选择是要么在BaseUIObject的每个子类中定义someObject变量,要么每次在SomeUIObject的方法中使用它时显式强制转换(SomeObject)someObject。这些方法都不是很干净,我觉得必须有一些更好的方法来使用继承来实现这一点。

感谢您的任何帮助。

回答

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... 
} 
+0

完美 - 这正是我之后我,但缺乏知识能够正常使用谷歌。感谢您的快速回复,会看到这是否有效。 – Cerzi

+0

在SomeUIObject的类型/名称空间的Setup()arg中找不到类型T的问题。 我也许应该注意到,BaseUIObject本身从另一个类继承,所以其实际的定义是: 公共抽象类BaseUIObject :OtherBaseClass其中T:BaseObject – Cerzi

+0

T型是你使用的继承声明的类型。你的代码现在如何? –